Como posso obter o diretório atual do usuário?

Usando isto:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 

Eu recebo esta saída:

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

Como posso obter o diretório raiz de todos os usuários? ie:

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

Pode ser que esta seja uma boa solução: tendo em conta se este é o Vista / Win7 ou XP e sem usar variables ​​de ambiente:

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

Embora o uso da variável de ambiente seja muito mais claro.

Experimentar:

 System.Environment.GetEnvironmentVariable("USERPROFILE"); 

Editar:

Se a versão do .NET que você está usando for 4 ou superior, você poderá usar a enumeração Environment.SpecialFolder :

 Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); 

Você pode obter o caminho UserProfile apenas com isto:

Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

Também é muito útil investigar o enum Environment.SpecialFolder . Use o LINQPad ou crie uma solução e execute este código:

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

Caminhos de pasta

Este é o resultado na minha máquina:

 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 

Btw. “fisch” são as primeiras 5 letras do meu sobrenome (e é alemão para “peixe”) . Esse é o nome de usuário atribuído ao entrar com uma conta da Microsoft.

 Environment.GetEnvironmentVariable("userprofile") 

Tentar navegar a partir de um SpecialFolder nomeado é propenso a problemas. Há vários motivos para que as pastas não estejam onde você espera – os usuários podem movê-las por conta própria, o GPO pode movê-las, o redirecionamento de pastas para caminhos UNC, etc.

O uso da variável de ambiente para o userprofile deve refletir qualquer um desses possíveis problemas.

Experimentar:

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

Brincando com variables ​​de ambiente ou offsets de pastas pai codificadas nunca é uma boa idéia quando há uma API para obter as informações desejadas, chame SHGetSpecialFolderPath(...,CSIDL_PROFILE,...)

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

você pode usar o seguinte código:

 if(Platform.Equals("WinCE")) { m_CurrentPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase); } else if(Platform.Equals("Win32NT")) { m_CurrentPath = Directory.GetCurrentDirectory(); } 

mais informações consulte: Obtenha o caminho do diretório atual no WinXP e no WinCE com c #