如何获取当前用户目录?

130

使用这个:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

我得到了这个输出:

"C:\\Documents and Settings\\[USER]\\Application Data"

如何获取所有用户的根目录?例如:

"C:\\Documents and Settings\\[USER]\\"

1
我最终使用的答案被删除了...这个可以用:Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)) - juan
2
Juan - 这并不总是对你起作用的 - 你只是这一次走运了。 - Scott Ivey
为什么?你是指像在Vista中一样吗?还是在XP中它会突然停止工作? - juan
5
请参见斯科特对杰伊·里格斯答案的评论。在W7和Vista上,“应用程序数据”文件夹位于不同的位置,因此您需要向上转到2个目录,而不是1个目录。 - Thomas
9个回答

208

尝试:

System.Environment.GetEnvironmentVariable("USERPROFILE");

编辑:

如果您使用的 .NET 版本为 4 或以上,可以使用 Environment.SpecialFolder 枚举:

Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

20
依赖环境变量来获取文件夹路径是一个非常糟糕的想法。因为这些环境变量可能会以多种方式发生改变。建议使用Environment.SpecialFolder枚举来获取文件夹路径。 - Jim Mischel
1
不幸的是,正如您所看到的http://msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx,USERPROFILE文件夹未包含在该枚举中。 - Thomas
Environment.SpecialFolder 包含在 .NET 1.1 中,只是没有 "UserProfile" 文件夹... - Elad Winkler
@JimMischel 但是那些不是可以更改的吗?如果你总是使用环境变量进行引用,那就没问题了。 - Nate-Wilkins

56

也许这会是一个不错的解决方案:考虑到当前操作系统是Vista/Win7还是XP,且不使用环境变量:

string path = Directory.GetParent(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)).FullName;
if ( Environment.OSVersion.Version.Major >= 6 ) {
    path = Directory.GetParent(path).ToString();
}

尽管使用环境变量更为清晰明了。


31
您只需使用以下代码即可获取用户配置文件路径:

Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);


23

当调查 Environment.SpecialFolder 枚举时,也非常有用。使用 LINQPad 或创建一个解决方案并执行此代码:

Enum.GetValues(typeof(Environment.SpecialFolder))
    .Cast<Environment.SpecialFolder>()
    .Select(specialFolder => new
    {
        Name = specialFolder.ToString(),
        Path = Environment.GetFolderPath(specialFolder)
    })
    .OrderBy(item => item.Path.ToLower())

文件夹路径

这是我机器上的结果:

MyComputer
LocalizedResources
CommonOemLinks
ProgramFiles            C:\Program Files (x86) 
ProgramFilesX86         C:\Program Files (x86) 
CommonProgramFiles      C:\Program Files (x86)\Common Files 
CommonProgramFilesX86   C:\Program Files (x86)\Common Files 
CommonApplicationData   C:\ProgramData 
CommonStartMenu         C:\ProgramData\Microsoft\Windows\Start Menu 
CommonPrograms          C:\ProgramData\Microsoft\Windows\Start Menu\Programs 
CommonAdminTools        C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools 
CommonStartup           C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup 
CommonTemplates         C:\ProgramData\Microsoft\Windows\Templates 
UserProfile             C:\Users\fisch 
LocalApplicationData    C:\Users\fisch\AppData\Local 
CDBurning               C:\Users\fisch\AppData\Local\Microsoft\Windows\Burn\Burn 
History                 C:\Users\fisch\AppData\Local\Microsoft\Windows\History 
InternetCache           C:\Users\fisch\AppData\Local\Microsoft\Windows\INetCache 
Cookies                 C:\Users\fisch\AppData\Local\Microsoft\Windows\INetCookies 
ApplicationData         C:\Users\fisch\AppData\Roaming 
NetworkShortcuts        C:\Users\fisch\AppData\Roaming\Microsoft\Windows\Network Shortcuts 
PrinterShortcuts        C:\Users\fisch\AppData\Roaming\Microsoft\Windows\Printer Shortcuts 
Recent                  C:\Users\fisch\AppData\Roaming\Microsoft\Windows\Recent 
SendTo                  C:\Users\fisch\AppData\Roaming\Microsoft\Windows\SendTo 
StartMenu               C:\Users\fisch\AppData\Roaming\Microsoft\Windows\Start Menu 
Programs                C:\Users\fisch\AppData\Roaming\Microsoft\Windows\Start Menu\Programs 
AdminTools              C:\Users\fisch\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Administrative Tools 
Startup                 C:\Users\fisch\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 
Templates               C:\Users\fisch\AppData\Roaming\Microsoft\Windows\Templates 
Desktop                 C:\Users\fisch\Desktop 
DesktopDirectory        C:\Users\fisch\Desktop 
Favorites               C:\Users\fisch\Favorites 
MyMusic                 C:\Users\fisch\Music 
MyDocuments             C:\Users\fisch\OneDrive\Documents 
MyDocuments             C:\Users\fisch\OneDrive\Documents 
MyPictures              C:\Users\fisch\OneDrive\Pictures 
MyVideos                C:\Users\fisch\Videos 
CommonDesktopDirectory  C:\Users\Public\Desktop 
CommonDocuments         C:\Users\Public\Documents 
CommonMusic             C:\Users\Public\Music 
CommonPictures          C:\Users\Public\Pictures 
CommonVideos            C:\Users\Public\Videos 
Windows                 C:\Windows 
Fonts                   C:\Windows\Fonts 
Resources               C:\Windows\resources 
System                  C:\Windows\system32 
SystemX86               C:\Windows\SysWoW64 

("fisch"是我的姓氏的前5个字母。这是使用Microsoft帐户登录时分配的用户名。)


我不知道为什么我从来没有听说过LINQPad,但是我试用了一下,这个工具真的很棒,感谢你的推荐。 - TravisO
现在它也可以在Visual Studio的C#交互中进行检查,但需要在末尾添加代码:.ToList().ForEach(item => Console.WriteLine(item)) - 以获得漂亮的输出。 - realsonic

4
Environment.GetEnvironmentVariable("userprofile")

尝试从命名的SpecialFolder导航可能会出现问题。有很多原因,导致文件夹不在您期望的位置-用户可以自行移动它们,GPO可以移动它们,将文件夹重定向到UNC路径等。
使用用户配置文件的环境变量应反映任何可能的问题。

3

尝试:

System.IO.Directory.GetParent(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)).FullName/

1
这在Windows 7上不起作用,如果我记得文件夹结构正确的话,我认为在Vista上也不会起作用。在Windows 7上,您需要向上转到2个父文件夹,因为ApplicationData文件夹是\%userprofile%\AppData\Roaming\。 - Scott Ivey
在我的Vista机器上,它会返回“C:\Users\Fredrik\AppData”(ApplicationData文件夹是“C:\Users\Fredrik\AppData\Roaming”)。 - Fredrik Mörk

2

-3
$env:USERPROFILE = "C:\\Documents and Settings\\[USER]\\"

请查看问题的评论。这并非适用于所有版本的Windows。 - Wai Ha Lee

-4
您可以使用以下代码:
if(Platform.Equals("WinCE"))
{
    m_CurrentPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
}
else if(Platform.Equals("Win32NT"))
{
    m_CurrentPath = Directory.GetCurrentDirectory();
}

更多信息请参见:使用C#获取WinXP和WinCE的当前目录路径


3
这完全不合适。OP正在询问当前“用户文件夹”,而不是工作文件夹。 - julealgon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接