2009-07-17 19 views
76

Bien, he comprobado Environment.SpecialFolder, pero no hay nada allí para esto.Obteniendo la ruta del directorio de inicio en C#?

Quiero obtener el directorio de inicio del usuario actual en C#. (Por ejemplo c:\documents and settings\user bajo XP, c:\users\user en Vista, y /home/user bajo Unix.)

Sé que puedo leer variables de entorno para averiguar esto, pero yo quiero hacer esto de una manera multiplataforma.

¿Hay alguna manera de que pueda hacer esto con .NET (preferentemente con mscorlib)?

ACTUALIZACIÓN: Bueno, este es el código que terminé usando:

string homePath = (Environment.OSVersion.Platform == PlatformID.Unix || 
        Environment.OSVersion.Platform == PlatformID.MacOSX) 
    ? Environment.GetEnvironmentVariable("HOME") 
    : Environment.ExpandEnvironmentVariables("%HOMEDRIVE%%HOMEPATH%"); 
+2

BOOM. El arma más rápida en el oeste: P –

+0

No sé sobre su máquina, pero en mi cuadro de XP% HOMEDRIVE %% HOMEPATH% es un directorio de red, no c: \ Documents and Settings \ user \ MSalters \ – MSalters

+0

Para ser honesto, considero esto exacto El problema es una infraejecución de .NET ... debería consultar la documentación de CSIDLS (http://msdn.microsoft.com/en-us/library/bb762494.aspx) para ver una lista completa de lo que Windows admite: Lo que realmente está buscando es CSIDL_PROFILE, que es compatible con Windows, pero no con .NET por algún motivo insondable. –

Respuesta

40

Environment.SpecialFolder.Personal en realidad no devuelve la carpeta de inicio, devuelve la carpeta Mis documentos. La forma más segura de obtener la carpeta de inicio en Win32 es leer %HOMEDRIVE%%HOMEPATH%. Leer las variables del entorno es en realidad muy portátil (en Unix y Windows), así que no estoy seguro de por qué el póster quería , no hacerlo.

Editado para agregar: Para multiplataforma (Windows/Unix) C#, que había leído $HOME en Unix y OSX y %HOMEDRIVE%%HOMEPATH% en Windows.

+0

Sé con certeza que HOMEDRIVE no existe en * nix, y normalmente es solo HOME, no HOMEPATH. –

+0

Matthew, tienes razón. Agregué una aclaración sobre el comentario original. – sigint

+0

+1 De acuerdo, esto es lo más cercano que vamos a tener. – AnthonyWJones

9

Creo que lo que busca es:

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

Como referencia, es de hecho contenida en mscorlib.

+0

Eso devuelve la carpeta Mis documentos. – MiffTheFox

+0

"Mis documentos" * es * lo más parecido que Windows tiene a un directorio particular. – MSalters

+6

@MStallers No,% HOMEDRIVE %% HOMEPATH% is. – MiffTheFox

0

Cuando dices de manera multiplataforma, ¿qué otros sistemas operativos necesitas para admitir? Es posible que necesite realizar una detección simple del sistema operativo para seleccionar el método para encontrar el directorio inicial si está ejecutando un sistema operativo que no es Windows.

This website parece dar una manera de hacer lo que necesita en Windows.

+0

A menos que esté usando alguna implementación braindead del Framework Environment.GetFolder() debería funcionar multiplataforma. –

+2

* Debería *. La implementación de MS no lo hace. –

0

No tengo una máquina para probarlo, pero %HOMESHARE% podría funcionar para usted. De lo contrario, aquí hay una muy buena list of environment variables.

3

La respuesta de la línea inferior es No. No es sencillo el método basado en el sistema en .NET para obtener el directorio de inicio de manera que podamos esperar una implementación tanto en .NET en Windows como en Mono.

Tendrá que hacer un poco de detección de sistema operativo y bifurcar al código específico del sistema operativo.

65
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); 

Personal is My Documents (o Documentos en win7).

+8

Tenga en cuenta que UserProfile es nuevo en .NET 4.0, si utiliza .NET 2.0/3.5, debe llamar a win32 API manualmente con el valor 40 para UserProfile – linquize

+0

Y "Mis documentos" no es lo mismo que el directorio principal, excepto en Windows 95, 98 y ME. –

+1

No olvides utilizar System.IO.Path.DirectorySeparatorChar para compilar tu ruta de archivo y mantenerla portátil. – thomiel

0

proposición:

using System.IO; 
var homeDrive = Environment.GetEnvironmentVariable("HOMEDRIVE"); 
if (homeDrive != null) 
{ 
    var homePath = Environment.GetEnvironmentVariable("HOMEPATH"); 
    if (homePath != null) 
    {    
    var fullHomePath = homeDrive + Path.DirectorySeparatorChar + homePath; 
    FolderPath = 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'"); 
} 

Entonces se produce bajo las ventanas: C:\\\\Users\\myusername\\myFolder

Tenga en cuenta que si utiliza

var fullHomePath = Path.Combine(homeDrive.ToString(), homePath.ToString()) 

falla causa que produce: \\Users\\myusername\\myFolder

4

En DotNetCore 1.1 System.Environment.SpecialFolder no exi S t. Puede existir en 2.0-beta. Hasta entonces, para hacer esto puede usar lo siguiente:

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

Estoy usando 2.0 y 'System.Environment.SpecialFolder' existe – snotyak

Cuestiones relacionadas