¿Cómo puedo obtener el directorio de usuarios actual?

100

Usando esto:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

Obtengo esta salida:

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

¿Cómo puedo obtener el directorio raíz de todos los usuarios? es decir:

"C:\\Documents and Settings\\[USER]\\"
juan
fuente
1
La respuesta que terminé usando fue eliminada ... esto funciona: Path.GetDirectoryName (Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData))
juan
2
Juan, eso no siempre funcionará para ti, simplemente tuviste suerte esta vez.
Scott Ivey
¿porqué es eso? quieres decir como en vista? o en xp dejará de funcionar de repente?
juan
5
vea el comentario de Scott sobre la respuesta de Jay Riggs. En W7 y Vista, la carpeta de datos de la aplicación está en un lugar diferente, por lo que tendría que subir 2 directorios, en lugar de 1.
Thomas

Respuestas:

48

Quizás esta sea una buena solución: teniendo en cuenta si se trata de Vista / Win7 o XP y sin utilizar variables de entorno:

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

Aunque usar la variable de entorno es mucho más claro.

Anton Kolesov
fuente
165

Tratar:

System.Environment.GetEnvironmentVariable("USERPROFILE");

Editar:

Si la versión de .NET que está utilizando es 4 o superior, puede utilizar la Environment.SpecialFolderenumeración:

Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
Thomas
fuente
16
Es una muy mala idea depender de las variables de entorno para obtener las rutas de las carpetas. Hay demasiadas formas de cambiar esas variables de entorno. La forma recomendada es con la enumeración Environment.SpecialFolder.
Jim Mischel
1
Desafortunadamente, como puede ver msdn.microsoft.com/en-us/library/… la carpeta USERPROFILE no está incluida en esa enumeración.
Thomas
Environment.SpecialFolder se incluye desde .NET 1.1, simplemente no tiene la carpeta "UserProfile" ...
Vini
@JimMischel ¿Pero no son esos supuestamente cambiables? Y si siempre hace referencia a la variable de entorno, está bien.
Nate-Wilkins
22

Puede obtener la ruta UserProfile con solo esto:

Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

zionyx
fuente
11

También es muy útil, al investigar la Environment.SpecialFolderenumeración. Utilice LINQPad o cree una solución y ejecute este código:

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

Rutas de carpeta

Este es el resultado en mi 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 

("fisch" son las primeras 5 letras de mi apellido. Este es el nombre de usuario asignado al iniciar sesión con una cuenta de Microsoft).

bytecode77
fuente
No sé cómo nunca he oído hablar de LINQPad, lo probé, esto es genial, gracias por recomendarlo.
TravisO
4
Environment.GetEnvironmentVariable("userprofile")

Intentar navegar hacia arriba desde una carpeta especial con nombre es propenso a tener problemas. Hay muchas razones por las que las carpetas no estarán donde las espera: los usuarios pueden moverlas por su cuenta, GPO puede moverlas, redireccionar carpetas a rutas UNC, etc.

El uso de la variable de entorno para el perfil de usuario debería reflejar cualquiera de esos posibles problemas.

Scott Ivey
fuente
3

Tratar:

System.IO.Directory.GetParent(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)).FullName/
Jay Riggs
fuente
1
Esto no funcionará en Windows 7, y supongo que tampoco funcionará en Vista si recuerdo bien la estructura de carpetas. El 7, tendría que subir 2 carpetas principales ya que la carpeta ApplicationData es \% userprofile% \ AppData \ Roaming \
Scott Ivey
Eso devuelve "C: \ Users \ Fredrik \ AppData" en mi máquina Vista (la carpeta ApplicationData es "C: \ Users \ Fredrik \ AppData \ Roaming")
Fredrik Mörk
-3
$env:USERPROFILE = "C:\\Documents and Settings\\[USER]\\"
Jeff
fuente
Eche un vistazo a los comentarios sobre la pregunta. Este no es el caso de todas las versiones de Windows.
Wai Ha Lee
-3

puede utilizar el siguiente código:

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

más información ver: Obtener la ruta del directorio actual en WinXP y WinCE con C #

ksblog
fuente
3
Esto está completamente fuera de lugar aquí. El OP solicita la carpeta de usuario actual , no la carpeta de trabajo.
julealgon