在C#中获取主目录的路径?

时间:2009-07-17 14:42:01

标签: c# .net

好的,我已经检查了Environment.SpecialFolder,但是没有任何内容可供选择。

我想在C#中获取当前用户的主目录。 (例如,XP下的c:\documents and settings\user,Vista下的c:\users\user和Unix下的/home/user

我知道我可以阅读环境变量来解决这个问题,但我希望以跨平台的方式做到这一点。

我有什么办法可以用.NET(最好是使用mscorlib)吗?

更新:好的,这是我最终使用的代码:

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

8 个答案:

答案 0 :(得分:79)

Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

个人是我的文件(或win7中的文件)。

答案 1 :(得分:46)

Environment.SpecialFolder.Personal实际上并不返回主文件夹,它会返回我的文档文件夹。在Win32上获取主文件夹最安全的方法是阅读%HOMEDRIVE%%HOMEPATH%。阅读环境变量实际上是非常便携的(跨Unix和Windows),所以我不确定为什么海报想这样做。

编辑添加:对于跨平台(Windows / Unix)C#,我在Unix和OSX上阅读$HOME,在Windows上阅读%HOMEDRIVE%%HOMEPATH%

答案 2 :(得分:12)

我相信你要找的是:

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

作为参考,它实际上包含在mscorlib

答案 3 :(得分:5)

在DotNetCore 1.1 System.Environment.SpecialFolder中不存在。它可能存在于2.0-beta中。在此之前,为此,您可以使用以下内容:

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

答案 4 :(得分:3)

底线答案是否定的。在.NET中没有简单的基于系统的方法来获取Home目录,以便我们可以期望在Windows和Mono上的.NET中实现。

您需要进行一些操作系统检测并转移到特定于操作系统的代码。

答案 5 :(得分:1)

当您说跨平台方式时,您需要支持哪些其他操作系统?如果您在非Windows操作系统上运行,则可能需要执行一些简单的操作系统检测来选择查找主目录的方法。

This website似乎提供了一种在Windows中执行所需操作的方法。

答案 6 :(得分:0)

我没有机器对其进行测试,但%HOMESHARE%可能适合您。否则,这是一个非常好的list of environment variables

答案 7 :(得分:0)

可以使用GetEnvironmentVariable中的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'");
    }
}

然后它在windows下生成:C:\\\\Users\\myusername\\myFolder

请注意,如果您使用

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

失败,因为它产生:\\Users\\myusername\\myFolder