C#でホームディレクトリのパスを取得していますか?


101

さて、Environment.SpecialFolderを確認しましたが、これについては何もありません。

C#で現在のユーザーのホームディレクトリを取得したいのですが。(例:c:\documents and settings\userXP、c:\users\userVista、/home/userUnixで。)

これを見つけるために環境変数を読み取ることができることはわかっていますが、これをクロスプラットフォームの方法で実行したいと考えています。

.NETで(できればmscorlibを使用して)これを行う方法はありますか?

更新:さて、これは私が最終的に使用したコードです:

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

2
ブーム。西部最速の砲:P
ボリスカレンス

Dunnoはあなたのマシンについてですが、私のXPボックスでは%HOMEDRIVE %% HOMEPATH%はネットワークディレクトリであり、c:\ Documents and Settings \ user \ MSalters \ではありません
MSalters 2009

正直に言うと、この正確な問題は.NETの実装が不十分であると考えています... CSIDLSのドキュメント(msdn.microsoft.com/en-us/library/bb762494.aspx)を参照して、完全なリストを確認してください。 Windowsがサポートするもの:実際に探しているのはCSIDL_PROFILEです。これはWindowsでサポートされていますが、何らかの理由で.NETではサポートされていません。
マシューシャーリー2009

1
次回はその結果を答えに入れるべきだと思います。
ピーター

PlatformID.MacOSXは必要ありません。PlatformID.UnixはMacOSXでもtrueを返します(または、少なくとも以前はそれを使用していました)。
Stefan Steiger、2015

回答:


51

Environment.SpecialFolder.Personal実際にはホームフォルダーを返さず、マイドキュメントフォルダーを返します。Win32でホームフォルダを取得する最も安全な方法は、を読むこと%HOMEDRIVE%%HOMEPATH%です。環境変数の読み取りは、実際には(UnixとWindows間で)非常に移植性が高いため、投稿者がそれを望まなかった理由がわかりません。

追加用に編集:クロスプラットフォーム(Windows / Unix)C#の場合、$HOMEUnixとOSX、および%HOMEDRIVE%%HOMEPATH%Windowsで読みました。


HOMEDRIVEは* nixには存在しないという事実を知っています。通常、それはHOMEPATHでなくHOMEだけです。
マシューシャーリー09/07/17

マシュー、その通りです。元のコメントに説明を追加しました。
sigint

12
Windowsで%USERPROFILE%を使用できませんか?
Lucas Jones、

1
$ HOMEはOS Xでも動作します。あなたがプラットフォームを検出しているので、これは私が懸念している限りではまだ正しい答えではありません...
マシューシャーリー09/07/17

2
person-b、%USERPROFILE%および%HOMEDRIVE %% HOMEPATH%は、多くの場合、パーソナルPCでは同じですが、ネットワーク環境の異なる場所を指していることがよくあります。たとえば、私のUSERPROFILEはC:\ Documents and Settings \ usernameですが、ホームディレクトリはZ:\です。これは、ITによって定期的にバックアップされるネットワークドライブです。
sigint

92
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)

個人はマイドキュメント(またはwin7以降のドキュメント)です。


8
UserProfileは.NET 4.0で新しく追加されました。.NET2.0 / 3.5を使用する場合、UserProfileに値40を指定してwin32 APIを手動で呼び出す必要があります
linquize

また、「マイドキュメント」は、Windows 95、98、およびMEを除いて、ホームディレクトリと同じではありません。
Jon Hanna

1
System.IO.Path.DirectorySeparatorCharを使用してファイルパスを構築し、移植性を維持することを忘れないでください。
thomiel 14

4
DirectorySeperatorCharを手動で使用しないでください。Path.Combineを使用します。
John Gietzen、2015年

14

私が探しているのは:

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

参考までに、に含まれている事実mscorlibです。


マイドキュメントフォルダーが返されます。
MiffTheFox 2009

「マイドキュメント」、Windowsがホームディレクトリに最も近いものです。
MSalters 2009

8
@MStallersいいえ、%HOMEDRIVE %% HOMEPATH%はそうです。
MiffTheFox 2009

よくわかりません...しかし、代替案はPInvokeであり、OPはマネージドソリューションを要求しました。
Matthew Scharley、2009

7
Environment.SpecialFolder.UserProfileは.NET 4.0で使用できることに注意してください。これは必要なものです
linquize

8

DotNetCore 1.1にSystem.Environment.SpecialFolderは存在しません。2.0-betaに存在する可能性があります。それまでは、これを行うには以下を使用できます。

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

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

4

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

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


1

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

このWebサイトは、Windowsで必要なことを行う方法を提供しているようです。


Framework Environment.GetFolder()の頭の悪い実装を使用しているのでない限り、クロスプラットフォームで動作するはずです。
R.マルティーニョフェルナンデス

2
すべきです。MSの実装はそれをしません。
R.マルティーニョフェルナンデス、

1

これはGetEnvironmentVariablein を使用して行うことができますSystem.IO

public string GetUserHome() {
    var homeDrive = Environment.GetEnvironmentVariable("HOMEDRIVE");
    if (!string.IsNullOrWhiteSpace(homeDrive))
    {
        var homePath = Environment.GetEnvironmentVariable("HOMEPATH");
        if (!string.IsNullOrWhiteSpace(homePath))
        {            
            var fullHomePath = homeDrive + Path.DirectorySeparatorChar + homePath;
            return 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'");
    }
}

次に、ウィンドウの下で生成されます: C:\\\\Users\\myusername\\myFolder

使用する場合は注意してください

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

それが生成するために失敗します: \\Users\\myusername\\myFolder


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.