2009-07-17 13 views
76

Okay, ich habe Environment.SpecialFolder überprüft, aber da ist nichts drin.Den Pfad des Home-Verzeichnisses in C# abrufen?

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

Ich weiß, ich Umgebungsvariablen lesen kann dies herauszufinden, aber ich möchte, dies zu tun in einer plattformübergreifende Art und Weise.

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

UPDATE: Okay, das ist der Code ich am Ende mit:

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 –

+0

Dunno über deine Maschine, aber auf meiner XP-Box% HOMEDRIVE %% HOMEPATH% ist ein Netzwerkverzeichnis, nicht c: \ Dokumente und Einstellungen \ user \ MSalters \ – MSalters

+0

Um ehrlich zu sein, halte ich das genau Problem, um eine Unterimplementierung von .NET zu sein ... Sie sollten sich die Dokumentation für CSIDLS (http://msdn.microsoft.com/en-us/library/bb762494.aspx) ansehen, um eine vollständige Liste dessen zu sehen, was Windows unterstützt: Was Sie tatsächlich suchen, ist CSIDL_PROFILE, das in Windows, aber nicht von .NET aus einem unergründlichen Grund unterstützt wird. –

Antwort

40

Environment.SpecialFolder.Personal nicht tatsächlich den Stammordner zurück, gibt es die My Documents Ordner. Der sicherste Weg, um den Home-Ordner auf Win32 zu erhalten, lautet %HOMEDRIVE%%HOMEPATH%. Lesen von Umgebungsvariablen ist tatsächlich sehr portabel zu tun (über Unix und Windows), so dass ich nicht sicher bin, warum das Plakat wollte nicht es tun.

Edited hinzufügen: für plattformübergreifende (Windows/Unix) C#, würde ich $HOME auf Unix und OS X und %HOMEDRIVE%%HOMEPATH% unter Windows lesen.

+0

Ich weiß in der Tat HOMEDRIVE existiert nicht auf * nix, und normalerweise ist es nur zu Hause, nicht HOMEPATH. –

+0

Matthew, du hast Recht. Ich fügte eine Erläuterung zu dem ursprünglichen Kommentar hinzu. – sigint

+0

+1 Einverstanden, das ist das nächste, was wir bekommen werden. – AnthonyWJones

9

Ich glaube, für das, was Sie suchen ist:

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

Als Referenz ist es infact enthalten in mscorlib.

+0

Das gibt den Ordner Eigene Dateien zurück. – MiffTheFox

+0

"Meine Dokumente" * ist das, was Windows am nächsten an einem Home-Verzeichnis hat. – MSalters

+6

@MStallers Nein,% HOMEDRIVE %% HOMEPATH% ist. – MiffTheFox

0

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

This website scheint einen Weg zu geben, um zu tun, was Sie in Windows brauchen.

+0

Es sei denn, Sie verwenden einige Braindead-Implementierung des Framework Environment.GetFolder() sollte plattformübergreifend arbeiten. –

+2

* Sollte *. MS-Implementierung tut es nicht. –

0

Ich habe keine Maschine, um es zu testen, aber %HOMESHARE% könnte für Sie arbeiten. Ansonsten, hier ist eine ziemlich gute list of environment variables.

3

Die Quintessenz lautet: Nein. Es ist keine einfache systembasierte Methode in .NET, um das Home-Verzeichnis zu erhalten, so dass wir eine Implementierung sowohl in .NET unter Windows als auch in Mono erwarten können.

Sie müssen einige Betriebssystemerkennung durchführen und zu Betriebssystemspezifischem Code verzweigen.

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

Persönlich ist Meine Dokumente (oder Dokumente in Win7).

+8

Beachten Sie, dass UserProfile neu in .NET 4.0 ist, wenn Sie .NET 2.0/3.5 verwenden, müssen Sie Win32 API manuell mit Wert 40 für UserProfile aufrufen – linquize

+0

Und "Eigene Dateien" ist nicht das gleiche wie das Ausgangsverzeichnis, außer in Windows 95, 98 und ME. –

+1

Vergessen Sie nicht, System.IO.Path.DirectorySeparatorChar zu verwenden, um Ihren Dateipfad zu erstellen, damit er portabel bleibt. – thomiel

0

Vorschlag:

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'"); 
} 

Dann ist es unter Windows erzeugt: C:\\\\Users\\myusername\\myFolder

Beachten Sie, dass, wenn Sie

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

es nicht weil es produziert: \\Users\\myusername\\myFolder

4

In DotNetCore 1.1 System.Environment.SpecialFolder nicht exi st. 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);` 
+0

Ich verwende 2.0 und 'System.Environment.SpecialFolder' existiert – snotyak

Verwandte Themen