Ottenere il percorso della directory home in C #?


101

Ok, ho controllato Environment.SpecialFolder, ma non c'è niente per questo.

Voglio ottenere la home directory dell'utente corrente in C #. (ad es. c:\documents and settings\usersotto XP, c:\users\userVista e /home/userUnix.)

So di poter leggere le variabili di ambiente per scoprirlo, ma voglio farlo in un modo multipiattaforma.

C'è un modo per farlo con .NET (preferibilmente usando mscorlib)?

AGGIORNAMENTO : Ok, questo è il codice che ho finito per usare:

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

2
BOOM. La pistola più veloce dell'ovest: P
Boris Callens

Non so della tua macchina, ma sulla mia macchina XP% HOMEDRIVE %% HOMEPATH% è una directory di rete, non c: \ Documents and Settings \ user \ MSalters \
MSalters

Per essere onesti, ritengo che questo problema esatto per essere un sottoutilizzo di .NET ... si dovrebbe guardare la documentazione per CSIDLS ( msdn.microsoft.com/en-us/library/bb762494.aspx ) per visualizzare un elenco completo di cosa supporta Windows: quello che stai effettivamente cercando è CSIDL_PROFILE, che è supportato in Windows, ma non da .NET per qualche motivo insondabile.
Matthew Scharley

1
Penso che dovresti inserire il risultato in una risposta, la prossima volta.
Peteter

PlatformID.MacOSX non è necessario, PlatformID.Unix restituisce true anche su MacOSX (o per lo meno lo era).
Stefan Steiger

Risposte:


51

Environment.SpecialFolder.Personalin realtà non restituisce la cartella home, restituisce la cartella Documenti . Il modo più sicuro per ottenere la cartella home su Win32 è leggere %HOMEDRIVE%%HOMEPATH%. La lettura delle variabili d'ambiente è in realtà molto portabile da fare (su Unix e Windows), quindi non sono sicuro del motivo per cui il poster volesse non farlo.

Modificato per aggiungere: per il C # multipiattaforma (Windows / Unix), leggerei $HOMEsu Unix e OSX e %HOMEDRIVE%%HOMEPATH%su Windows.


So per certo che HOMEDRIVE non esiste su * nix, e normalmente è solo HOME, non HOMEPATH.
Matthew Scharley

Matthew, hai ragione. Ho aggiunto una precisazione sul commento originale.
sigint

12
Non puoi usare% USERPROFILE% su Windows?
Lucas Jones

1
$ HOME funziona anche su OS X. Questa non è ancora la risposta corretta per quanto mi riguarda, dato che stai effettuando il rilevamento della piattaforma ... ma per ottenere i valori esatti richiesti, questo è quello che devi fare.
Matthew Scharley

2
person-b,% USERPROFILE% e% HOMEDRIVE %% HOMEPATH% spesso coincidono sui PC personali, ma spesso puntano a luoghi diversi negli ambienti di rete. Ad esempio, al lavoro il mio USERPROFILE è C: \ Documents and Settings \ username ma la home directory è Z: \, che è un'unità di rete di cui viene eseguito il backup regolarmente dall'IT.
sigint

92
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)

Personale è My Documents (o Documents in win7 e versioni successive).


8
Nota che UserProfile è nuovo in .NET 4.0, se usi .NET 2.0 / 3.5, devi chiamare manualmente l'API win32 con valore 40 per UserProfile
linquize

E "My Documents" non è la stessa della directory home, tranne che in Windows 95, 98 e ME.
Jon Hanna,

1
Non dimenticare di utilizzare System.IO.Path.DirectorySeparatorChar per creare il percorso del tuo file in modo da mantenerlo portatile.
thomiel

4
Non utilizzare DirectorySeperatorChar manualmente. Usa Path.Combine.
John Gietzen

14

Credo che quello che stai cercando sia:

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

Per riferimento, è infatti contenuto in mscorlib.


Ciò restituisce la cartella Documenti.
MiffTheFox

"My Documents" è l'elemento più vicino a Windows di una directory home.
MSalters

8
@MStallers No,% HOMEDRIVE %% HOMEPATH% lo è.
MiffTheFox

Non proprio ... ma l'alternativa è PInvoke e l'OP ha chiesto una soluzione gestita.
Matthew Scharley

7
Nota che Environment.SpecialFolder.UserProfile è disponibile in .NET 4.0, che è quello che vuoi
linquize

8

In DotNetCore 1.1 System.Environment.SpecialFoldernon esiste. Potrebbe esistere in 2.0-beta. Fino ad allora, per fare ciò puoi usare quanto segue:

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

Sto usando 2.0 ed System.Environment.SpecialFolderesiste
snotyak

4

La risposta alla conclusione è No. Non è un semplice metodo basato sul sistema in .NET per ottenere la directory Home in modo tale che potremmo aspettarci un'implementazione sia in .NET su Windows che in Mono.

Sarà necessario eseguire il rilevamento del sistema operativo e passare al codice specifico del sistema operativo.


1

Quando dici modalità multipiattaforma, quali altri sistemi operativi devi supportare? Potrebbe essere necessario eseguire un semplice rilevamento del sistema operativo per selezionare il metodo per trovare la directory home se si esegue su un sistema operativo non Windows.

Questo sito Web sembra fornire un modo per fare ciò di cui hai bisogno in Windows.


A meno che tu non stia utilizzando un'implementazione braindead di Framework Environment, GetFolder () dovrebbe funzionare su più piattaforme.
R. Martinho Fernandes

2
Dovrebbe . L'implementazione di MS non lo fa.
R. Martinho Fernandes

1

Questo può essere fatto utilizzando GetEnvironmentVariablein System.IO:

public string GetUserHome() {
    var homeDrive = Environment.GetEnvironmentVariable("HOMEDRIVE");
    if (!string.IsNullOrWhiteSpace(homeDrive))
    {
        var homePath = Environment.GetEnvironmentVariable("HOMEPATH");
        if (!string.IsNullOrWhiteSpace(homePath))
        {            
            var fullHomePath = homeDrive + Path.DirectorySeparatorChar + homePath;
            return 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'");
    }
}

Quindi produce sotto Windows: C:\\\\Users\\myusername\\myFolder

Nota che se usi

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

fallisce perché produce: \\Users\\myusername\\myFolder


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.