2009-07-17 16 views
76

さて、Environment.SpecialFolderをチェックしましたが、そこには何もありません。C#でホームディレクトリのパスを取得していますか?

C#で現在のユーザーのホームディレクトリを取得します。 (例えば、XPの下c:\documents and settings\user、Vistaでc:\users\user、およびUnixで/home/user。)

私はこれを見つけるために的環境変数を読み込むことができます知っているが、私は、クロスプラットフォームな方法でこれをやりたいです。

.NETでこれを行う方法はありますか(mscorlibを使用することをお勧めします)?

UPDATE:さて、これは私が使用して終了コードです:

string homePath = (Environment.OSVersion.Platform == PlatformID.Unix || 
        Environment.OSVersion.Platform == PlatformID.MacOSX) 
    ? Environment.GetEnvironmentVariable("HOME") 
    : Environment.ExpandEnvironmentVariables("%HOMEDRIVE%%HOMEPATH%"); 
+2

BOOM。西で最も速い銃:P –

+0

あなたのマシンについてはダンノですが、私のXPボックスでは%HOMEPRIVE %% HOMEPATH%はネットワークディレクトリで、c:\ Documents and Settings \ user \ MSalters \ – MSalters

+0

ではありません。問題が.NETの実装の不足になっている... Windowsがサポートしているすべての一覧を見るには、CSIDLS(http://msdn.microsoft.com/en-us/library/bb762494.aspx)のドキュメントを参照する必要があります。実際に探しているのは、CSIDL_PROFILEです。これは、Windowsではサポートされていますが、検討できない理由で.NETではサポートされていません。 –

答えて

40

Environment.SpecialFolder.Personal実際にホームフォルダを返さない場合は、マイドキュメントフォルダを返します。 Win32でホームフォルダを取得する最も安全な方法は、%HOMEDRIVE%%HOMEPATH%です。環境変数を読むことは、実際には(UnixとWindows上で)実行するのに非常に移植性が高いので、なぜポスターがでないのかはわかりません。です。追加するように編集

クロスプラットフォーム(Windowsの/ Unixの)C#の場合、私は、Windows上でUnixとOSX上 $HOME%HOMEDRIVE%%HOMEPATH%を読みました。

+0

私はHOMEDRIVEが* nixに存在しないという事実を知っています。通常はHOMEPATHではなくHOMEです。 –

+0

マシュー、そうです。元のコメントを明確にしました。 – sigint

+0

+1合意しました。これは私たちが手にする最も近いものです。 – AnthonyWJones

9

私は、あなたが探していることであると信じて:参考

System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal) 

、それはInfactはに含まれていますmscorlib

+0

マイドキュメントフォルダを返します。 – MiffTheFox

+0

"マイドキュメント" *は、Windowsがホームディレクトリと最も近いものです。 – MSalters

+6

@MStallersいいえ、%HOMEDRIVE %% HOMEPATH%はです。 – MiffTheFox

0

クロスプラットフォームで言うと、他のどのOSをサポートする必要がありますか? Windows以外のOSで実行している場合、ホームディレクトリを見つける方法を選択するには、シンプルなOS検出を行う必要があります。

This website Windowsで必要な作業を行う方法があるようです。

+0

Framework Environment.GetFolder()のいくつかのbraindead実装を使用していない限り、クロスプラットフォームで動作するはずです。 –

+2

*する必要があります。 MSの実装はそれをしません。 –

0

私はそれをテストするマシンを持っていませんが、%HOMESHARE%が役に立つかもしれません。そうでなければ、ここにはかなり良いlist of environment variablesがあります。

3

最終的な答えはいいえです。Windowsの.NETとMonoの両方で実装が期待できるように、ホームディレクトリを取得するには.NETの単純なシステムベースの方法ではありません。

OSの検出を行い、OS固有のコードに分岐する必要があります。

65
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); 

パーソナルはマイドキュメント(またはwin7のドキュメント)です。

+8

UserProfileは.NET 4.0で新しくなっていますが、.NET 2.0/3.5を使用する場合はUserProfileの値として40という値を手動で呼び出す必要があります。 – linquize

+0

"My Documents"はホームディレクトリと同じではありませんWindows 95,98、およびMEです。 –

+1

ファイルパスを移植性を保つために構築するには、System.IO.Path.DirectorySeparatorCharを使用することを忘れないでください。 – thomiel

0

命題:

using System.IO; 
var homeDrive = Environment.GetEnvironmentVariable("HOMEDRIVE"); 
if (homeDrive != null) 
{ 
    var homePath = Environment.GetEnvironmentVariable("HOMEPATH"); 
    if (homePath != null) 
    {    
    var fullHomePath = homeDrive + Path.DirectorySeparatorChar + homePath; 
    FolderPath = Path.Combine(fullHomePath, "myFolder"); 
    } 
    else 
    { 
    throw new Exception("Environment variable error, there is no 'HOMEPATH'"); 
    } 
} 
else 
{ 
    throw new Exception("Environment variable error, there is no 'HOMEDRIVE'"); 
} 

そして、それは窓の下に生成します。DotNetCore 1.1で\\Users\\myusername\\myFolder

4

を:あなたは

var fullHomePath = Path.Combine(homeDrive.ToString(), homePath.ToString()) 

を使用する場合それが生成する原因、それが失敗したことをC:\\\\Users\\myusername\\myFolder

注意System.Environment.SpecialFolderはありませんst。それは2.0-betaに存在する可能性があります。それまでは、次のようにすることができます。

var envHome = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "HOMEPATH" : "HOME"; 
var home = Environment.GetEnvironmentVariable(envHome);` 
+0

私は2.0を使用していますし、 'System.Environment.SpecialFolder'が存在します – snotyak

関連する問題