368 Stimmen

Wie lässt sich das Home-Verzeichnis eines Benutzers in Java am besten finden?

Wie lässt sich das Home-Verzeichnis eines Benutzers in Java am besten finden?

Die Schwierigkeit besteht darin, dass die Lösung plattformübergreifend sein sollte; sie sollte unter Windows 2000, XP, Vista, OS X, Linux und anderen Unix-Varianten funktionieren. Ich bin auf der Suche nach einem Codeschnipsel, der dies für alle Plattformen bewerkstelligen kann, und nach einer Möglichkeit, die Plattform zu erkennen.

Per Java-Fehler 4787931 , Systemeigenschaft user.home funktioniert unter Windows XP nicht korrekt, daher ist die Verwendung dieser Systemeigenschaft keine akzeptable Lösung, da sie nicht plattformübergreifend ist.

15voto

mladzo Punkte 1336

Eine Alternative wäre die Verwendung von Apache CommonsIO FileUtils.getUserDirectory() anstelle von System.getProperty("user.home") . Damit erhalten Sie das gleiche Ergebnis und es besteht keine Möglichkeit, bei der Angabe der Systemeigenschaft einen Tippfehler zu machen.

Die Wahrscheinlichkeit ist groß, dass Sie die Apache CommonsIO-Bibliothek bereits in Ihrem Projekt einsetzen. Führen Sie sie nicht ein, wenn Sie sie nur zum Abrufen des Benutzer-Home-Verzeichnisses verwenden wollen.

7voto

Peter Punkte 71

Als ich nach der Scala-Version suchte, konnte ich nur McDowells obigen JNA-Code finden. Ich füge meine Scala-Portierung hier ein, da es derzeit keine geeignetere Stelle gibt.

import com.sun.jna.platform.win32._
object jna {
    def getHome: java.io.File = {
        if (!com.sun.jna.Platform.isWindows()) {
            new java.io.File(System.getProperty("user.home"))
        }
        else {
            val pszPath: Array[Char] = new Array[Char](WinDef.MAX_PATH)
            new java.io.File(Shell32.INSTANCE.SHGetSpecialFolderPath(null, pszPath, ShlObj.CSIDL_MYDOCUMENTS, false) match {
                case true => new String(pszPath.takeWhile(c => c != '\0'))
                case _    => System.getProperty("user.home")
            })
        }
    }
}

Wie bei der Java-Version müssen Sie auch hier die Nativer Java-Zugang einschließlich der beiden jar-Dateien, zu Ihren referenzierten Bibliotheken.

Es ist schön zu sehen, dass JNA dies jetzt viel einfacher macht als zum Zeitpunkt, als der ursprüngliche Code veröffentlicht wurde.

2voto

Lawrence Dol Punkte 61053

Ich würde den im Fehlerbericht beschriebenen Algorithmus mit System.getenv(String) verwenden und auf die Eigenschaft user.dir zurückgreifen, wenn keine der Umgebungsvariablen ein gültiges Verzeichnis anzeigt. Dies sollte plattformübergreifend funktionieren.

Ich denke, unter Windows ist das, was Sie wirklich suchen, das fiktive "Dokumente"-Verzeichnis des Benutzers.

1voto

Neil Benn Punkte 864

Wenn Sie etwas wollen, das auch unter Windows funktioniert, gibt es ein Paket namens WinFoldersJava die den nativen Aufruf umhüllt, um die "speziellen" Verzeichnisse unter Windows zu erhalten. Wir verwenden es häufig und es funktioniert gut.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X