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%");

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 .


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).


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.


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);`

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.


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.


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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.