我怎样才能得到当前的用户目录?
使用这个:
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
我得到这个输出:
"C:\\Documents and Settings\\[USER]\\Application Data"
我如何获得所有用户的根目录? 即:
"C:\\Documents and Settings\\[USER]\\"
可能这是一个很好的解决scheme:考虑到这是Vista / Win7或XP,而不使用环境variables:
string path = Directory.GetParent(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)).FullName; if ( Environment.OSVersion.Version.Major >= 6 ) { path = Directory.GetParent(path).ToString(); }
虽然使用环境variables更清晰。
尝试:
System.Environment.GetEnvironmentVariable("USERPROFILE");
编辑:
如果您使用的.NET版本是4或更高版本,则可以使用Environment.SpecialFolder
枚举:
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
你可以通过这个获得UserProfilepath:
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
Environment.GetEnvironmentVariable("userprofile")
尝试从命名的SpecialFolder向上导航容易出现问题。 有很多原因,这些文件夹不会在您期望的位置 – 用户可以自行移动它们,GPO可以移动它们,文件夹redirect到UNCpath等。
对用户configuration文件使用环境variables应该反映任何这些可能的问题。
尝试:
System.IO.Directory.GetParent(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)).FullName/
在调查Environment.SpecialFolder
枚举的同时也非常有帮助。 使用LINQPad或创build解决scheme并执行以下代码:
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个字母(德文是“fish”) 。 这是使用Microsoft帐户login时分配的用户名。
当有一个API来获取你想要的信息,调用SHGetSpecialFolderPath(...,CSIDL_PROFILE,...)
,环境variables或硬编码的父文件夹偏移量不是一个好主意SHGetSpecialFolderPath(...,CSIDL_PROFILE,...)
$env:USERPROFILE = "C:\\Documents and Settings\\[USER]\\"
你可以使用下面的代码:
if(Platform.Equals("WinCE")) { m_CurrentPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase); } else if(Platform.Equals("Win32NT")) { m_CurrentPath = Directory.GetCurrentDirectory(); }
更多信息请参阅: 使用C#在WinXP和WinCE中获取当前目录path