Den Pfad des Home-Verzeichnisses in C # abrufen?

100

Okay, ich habe Environment.SpecialFolder überprüft, aber dafür ist nichts drin.

Ich möchte das Home-Verzeichnis des aktuellen Benutzers in C # erhalten. (zB c:\documents and settings\userunter XP, c:\users\userunter Vista und /home/userunter Unix.)

Ich weiß, dass ich Umgebungsvariablen lesen kann, um dies herauszufinden, aber ich möchte dies plattformübergreifend tun.

Gibt es eine Möglichkeit, dies mit .NET zu tun (vorzugsweise mit mscorlib)?

UPDATE : Okay, das ist der Code, den ich letztendlich verwendet habe:

string homePath = (Environment.OSVersion.Platform == PlatformID.Unix || 
                   Environment.OSVersion.Platform == PlatformID.MacOSX)
    ? Environment.GetEnvironmentVariable("HOME")
    : Environment.ExpandEnvironmentVariables("%HOMEDRIVE%%HOMEPATH%");
MiffTheFox
quelle
2
BOOM. Schnellste Waffe im Westen: P
Boris Callens
Keine Ahnung von Ihrem Computer, aber auf meiner XP-Box% HOMEDRIVE %% HOMEPATH% ist ein Netzwerkverzeichnis, nicht c: \ Dokumente und Einstellungen \ Benutzer \ MSalters \
MSalters
Um ehrlich zu sein, halte ich genau dieses Problem für eine Unterimplementierung von .NET. Eine vollständige Liste finden Sie in der Dokumentation zu CSIDLS ( msdn.microsoft.com/en-us/library/bb762494.aspx ) Was Windows unterstützt: Was Sie tatsächlich suchen, ist CSIDL_PROFILE, das in Windows unterstützt wird, jedoch aus unerfindlichen Gründen nicht von .NET.
Matthew Scharley
1
Ich denke, Sie sollten das Ergebnis beim nächsten Mal in eine Antwort einfügen.
Peteter
PlatformID.MacOSX ist nicht erforderlich, PlatformID.Unix gibt auch unter MacOSX true zurück (oder zumindest früher).
Stefan Steiger

Antworten:

51

Environment.SpecialFolder.PersonalGibt den Home-Ordner nicht zurück, sondern den Ordner Eigene Dateien. Der sicherste Weg, um den Home-Ordner unter Win32 zu erhalten, ist das Lesen %HOMEDRIVE%%HOMEPATH%. Das Lesen von Umgebungsvariablen ist tatsächlich sehr portabel (unter Unix und Windows), daher bin ich mir nicht sicher, warum das Poster dies nicht tun wollte.

Bearbeitet, um hinzuzufügen: Für plattformübergreifendes (Windows / Unix) C # habe ich $HOMEunter Unix und OSX sowie %HOMEDRIVE%%HOMEPATH%unter Windows gelesen .

Sigint
quelle
Ich weiß, dass HOMEDRIVE auf * nix nicht existiert, und normalerweise ist es nur HOME, nicht HOMEPATH.
Matthew Scharley
Matthew, du hast recht. Ich habe den ursprünglichen Kommentar präzisiert.
Sigint
12
Können Sie% USERPROFILE% unter Windows nicht verwenden?
Lucas Jones
1
$ HOME funktioniert auch unter OS X. Dies ist für mich immer noch nicht die richtige Antwort, da Sie die Plattformerkennung durchführen ... aber um die genauen gewünschten Werte zu erreichen, müssen Sie genau das tun.
Matthew Scharley
2
person-b,% USERPROFILE% und% HOMEDRIVE %% HOMEPATH% sind auf PCs häufig gleich, verweisen jedoch häufig auf unterschiedliche Stellen in Netzwerkumgebungen. Bei der Arbeit lautet mein USERPROFILE beispielsweise C: \ Dokumente und Einstellungen \ Benutzername, aber das Ausgangsverzeichnis ist Z: \, ein Netzwerklaufwerk, das regelmäßig von der IT gesichert wird.
Sigint
91
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)

Persönlich ist Eigene Dateien (oder Dokumente in Win7 und höher).

James
quelle
8
Beachten Sie, dass UserProfile neu in .NET 4.0 ist. Wenn Sie .NET 2.0 / 3.5 verwenden, müssen Sie die win32-API manuell mit dem Wert 40 für UserProfile aufrufen
Linquize
Und "Eigene Dateien" ist nicht dasselbe wie das Ausgangsverzeichnis, außer in Windows 95, 98 und ME.
Jon Hanna
1
Vergessen Sie nicht, System.IO.Path.DirectorySeparatorChar zu verwenden, um Ihren Dateipfad zu erstellen, damit er portabel bleibt.
Thomiel
4
Verwenden Sie DirectorySeperatorChar nicht manuell. Verwenden Sie Path.Combine.
John Gietzen
14

Ich glaube, was Sie suchen, ist:

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

Als Referenz ist es in enthalten mscorlib.

Matthew Scharley
quelle
Das gibt den Ordner Eigene Dateien zurück.
MiffTheFox
"Eigene Dateien" ist das, was Windows einem Basisverzeichnis am nächsten kommt.
MSalters
8
@MStallers Nein,% HOMEDRIVE %% HOMEPATH% ist.
MiffTheFox
Nicht ganz ... aber die Alternative ist PInvoke, und das OP fragte nach einer verwalteten Lösung.
Matthew Scharley
7
Beachten Sie, dass Environment.SpecialFolder.UserProfile in .NET 4.0 verfügbar ist, was Sie möchten
Linquize
8

In DotNetCore 1.1 System.Environment.SpecialFolderexistiert nicht. Es könnte in 2.0-Beta existieren. Bis dahin können Sie dazu Folgendes verwenden:

var envHome = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "HOMEPATH" : "HOME";
var home = Environment.GetEnvironmentVariable(envHome);`
KBP
quelle
Ich benutze 2.0 und System.Environment.SpecialFolderexistiert
Snotyak
4

Die Antwort lautet unter dem Strich Nein. Dies ist keine einfache systembasierte Methode in .NET, um das Home-Verzeichnis so abzurufen, dass wir eine Implementierung sowohl in .NET unter Windows als auch in Mono erwarten können.

Sie müssen eine Betriebssystemerkennung durchführen und zu betriebssystemspezifischem Code verzweigen.

AnthonyWJones
quelle
1

Welche anderen Betriebssysteme müssen Sie unterstützen, wenn Sie plattformübergreifend sagen? Möglicherweise müssen Sie eine einfache Betriebssystemerkennung durchführen, um die Methode zum Suchen des Basisverzeichnisses auszuwählen, wenn Sie unter einem Nicht-Windows-Betriebssystem ausgeführt werden.

Diese Website scheint eine Möglichkeit zu bieten, das zu tun, was Sie in Windows benötigen.

John D.
quelle
Es sei denn, Sie verwenden eine Braindead-Implementierung der Framework-Umgebung. GetFolder () sollte plattformübergreifend funktionieren.
R. Martinho Fernandes
2
Sollte . Die Implementierung von MS macht das nicht.
R. Martinho Fernandes
1

Dies kann unter Verwendung von 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'");
    }
}

Dann produziert es unter Windows: C:\\\\Users\\myusername\\myFolder

Beachten Sie, dass, wenn Sie verwenden

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

es schlägt fehl, weil es produziert: \\Users\\myusername\\myFolder

Nicosmik
quelle
0

Ich habe keine Maschine zum Testen, %HOMESHARE%könnte aber für Sie arbeiten. Ansonsten ist hier eine ziemlich gute Liste von Umgebungsvariablen .

JP Alioto
quelle