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

zlhcx6iw  于 2023-01-03  发布在  .NET
关注(0)|答案(9)|浏览(427)

好吧,我查了环境。特殊文件夹,但里面没有这个。
我想获取当前用户在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%");
aelbi1ox

aelbi1ox1#

您要查找的Environment.SpecialFolder.UserProfile在Windows上是指C:\Users\myname,在Unix/Linux上是指/home/myname

Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)

注意Environment.SpecialFolder.Personal是我的文档(或win7和更高版本中的文档),但与Unix/Linux上的主目录相同。

hgc7kmma

hgc7kmma2#

Environment.SpecialFolder.Personal实际上并不返回主文件夹,它返回的是 My Documents 文件夹。在Win32上获取主文件夹最安全的方法是读取%HOMEDRIVE%%HOMEPATH%。阅读环境变量实际上是非常可移植的(跨Unix和Windows),所以我不知道为什么发帖者想 * 不 * 这样做。

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

ecbunoof3#

我相信你要找的是:

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

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

rn0zuynd

rn0zuynd4#

在DotNetCore 1.1中不存在System.Environment.SpecialFolder。它可能存在于2.0-beta中。在此之前,您可以使用以下命令执行此操作:

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

oogrdqng5#

底线答案是否定的。这不是一个简单的基于系统的方法,在.NET中获得主目录,使我们可以期望在Windows上的.NET和Mono中的实现。
您将需要执行一些操作系统检测并分支到特定于操作系统的代码。

izkcnapc

izkcnapc6#

当你说跨平台的方式,你还需要支持哪些操作系统?如果你运行在非Windows操作系统上,你可能需要做一些简单的操作系统检测来选择查找主目录的方法。
This website似乎给予了一种在Windows中做你需要的事情的方法。

nmpmafwu

nmpmafwu7#

这可以在System.IO中使用GetEnvironmentVariable来完成:

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

u3r8eeie

u3r8eeie8#

我没有一台机器来测试它,但是%HOMESHARE%可能对你有用。另外,这里有一个相当不错的list of environment variables

dz6r00yl

dz6r00yl9#

仅供将来参考,Windows 10中预定义变量的列表,取自Windows 10 default environment variables
| 变量| windows 10|
| - ------| - ------|
| %所有用户配置文件%| C:\程序数据|
| %苹果酸%| C:\用户{用户名}\应用程序数据\漫游|
| % CD %|当前目录完整路径。(仅命令)|
| %指令指令行%|返回用于启动当前cmd.exe会话的确切命令行。(仅命令)|
| % CMDEX版本%|当前命令处理器扩展的数目。(仅命令)|
| %公用程序文件%| C:\程序文件\公用文件|
| %公用程序文件(x86)%| C:\程序文件(x86)\公用文件|
| %常用程序W6432%| C:\程序文件\公用文件|
| %计算机名%|当前本地系统的计算机名。|
| % COMSPEC %| C:\Windows\System32\cmd.exe|
| 日期|当前日期的格式由"日期"命令确定。(仅命令)|
| %错误级别%|定义前一命令或程序退出状态的编号。(仅命令)|
| %本地驱动器%|丙:||
| %主页路径%| C:\用户{用户名}|
| LOCALAPDATA %| C:\用户{用户名}\应用程序数据\本地|
| %登录服务器%| {域登录服务器} \Microsoft帐户|
| %处理器数目%|八个|
| %总生存率%| Windows_NT|
| %路径%| C:\ windows ; C:\ windows \系统32; C:\Windows操作系统\System32系统\Web浏览器C:\ windows \系统32\ windows PowerShell\v1.0|
| %路径扩展%| . COM文件;. EXE文件;. BAT文件; . CMD;. VBS;. VBE;.命令;.命令;. . JS;. JSE;. WSF; . WSH;. MSC|
| %处理器体系结构%| AMD64|
| %处理器标识符%|英特尔64系列6型号158步进9,正版英特尔|
| %处理器级别%|六个|
| %处理器版本%|九月九日|
| %方案数据%| C:\程序数据|
| %方案文件%| C:\程序文件|
| %程序W6432%| C:\程序文件|
| %程序文件(X86)%| C:\程序文件(x86)|
| %提示%|当前命令提示符格式的代码。代码通常为$P $G(仅命令)|
| % PS模块路径%| C:\ windows \系统32\ windows PowerShell\v1.0\模块||
| %公开%| C:\用户\公用|
| %随机%|获取0到32767之间的随机数。(仅命令)|
| %会话名称%|直接登录到计算机时,返回"控制台"。当客户端通过终端服务器会话连接时,是组合连接名称,后跟井号{#}和会话号。|
| %系统驱动器%|丙:|
| %系统根目录%| C:\窗口|
| %温度%| C:\用户{用户名}\应用程序数据\本地\临时|
| % TMP %| C:\用户{用户名}\应用程序数据\本地\临时|
| %时间%|当前时间,格式由"时间"命令确定。(仅命令)|
| %用户域%|与当前用户关联的网络域名。|
| %用户域漫游配置文件%|与当前漫游配置文件关联的网络域名。|
| %用户名%| {用户名}|
| %用户配置文件%| C:\用户{用户名}|
| %风方向%| C:\窗口|

相关问题