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

467voto

DJClayworth Punkte 25458

Der von Ihnen angesprochene Fehler (Fehler 4787391) wurde in Java 8 behoben. Auch wenn Sie eine ältere Version von Java verwenden, kann der System.getProperty("user.home") ist wahrscheinlich immer noch der beste Ansatz. Die user.home Dieser Ansatz scheint in einer sehr großen Zahl von Fällen zu funktionieren. Eine hundertprozentig kugelsichere Lösung unter Windows ist schwierig, da Windows eine andere Vorstellung davon hat, was das Heimatverzeichnis bedeutet.

Wenn user.home nicht gut genug für Sie ist, würde ich vorschlagen, eine Definition von home directory für Windows und dessen Verwendung, indem Sie die entsprechende Umgebungsvariable mit System.getenv(String) .

175voto

Paulo Fidalgo Punkte 20626

Bei Java 8 ist der richtige Weg die Verwendung von:

System.getProperty("user.home");

Der Fehler JDK-6519127 wurde behoben und der Abschnitt "Inkompatibilitäten zwischen JDK 8 und JDK 7" der Versionshinweise estados:

Gebiet: Kernbibliotheken / java.lang

Synopse

Die Schritte zur Ermittlung des Home-Verzeichnisses des Benutzers unter Windows wurden geändert, um dem von Microsoft empfohlenen Ansatz zu folgen. Diese Änderung ist möglicherweise bei älteren Windows-Editionen zu beobachten oder wenn die Registrierung Einstellungen oder Umgebungsvariablen auf andere Verzeichnisse gesetzt sind. Art der Inkompatibilität

behavioral RFE

6519127

Obwohl die Frage schon alt ist, möchte ich sie als Referenz für die Zukunft aufbewahren.

43voto

Joachim Sauer Punkte 290477
System.getProperty("user.home");

Siehe die [JavaDoc](http://java.sun.com/javase/6/docs/api/java/lang/System.html#getProperties()) .

32voto

McDowell Punkte 105255

Das Konzept des HOME-Verzeichnisses scheint unter Windows ein wenig vage zu sein. Wenn das Umgebungsvariablen (HOMEDRIVE/HOMEPATH/USERPROFILE) nicht ausreichen, müssen Sie möglicherweise auf die Verwendung nativer Funktionen über JNI o JNA . SHGetFolderPath ermöglicht es Ihnen, spezielle Ordner abzurufen, wie Meine Dokumente (CSIDL_PERSONAL) oder Lokale Einstellungen \Application Daten (CSIDL_LOCAL_APPDATA).

Beispiel für JNA-Code:

public class PrintAppDataDir {

    public static void main(String[] args) {
        if (com.sun.jna.Platform.isWindows()) {
            HWND hwndOwner = null;
            int nFolder = Shell32.CSIDL_LOCAL_APPDATA;
            HANDLE hToken = null;
            int dwFlags = Shell32.SHGFP_TYPE_CURRENT;
            char[] pszPath = new char[Shell32.MAX_PATH];
            int hResult = Shell32.INSTANCE.SHGetFolderPath(hwndOwner, nFolder,
                    hToken, dwFlags, pszPath);
            if (Shell32.S_OK == hResult) {
                String path = new String(pszPath);
                int len = path.indexOf('\0');
                path = path.substring(0, len);
                System.out.println(path);
            } else {
                System.err.println("Error: " + hResult);
            }
        }
    }

    private static Map<String, Object> OPTIONS = new HashMap<String, Object>();
    static {
        OPTIONS.put(Library.OPTION_TYPE_MAPPER, W32APITypeMapper.UNICODE);
        OPTIONS.put(Library.OPTION_FUNCTION_MAPPER,
                W32APIFunctionMapper.UNICODE);
    }

    static class HANDLE extends PointerType implements NativeMapped {
    }

    static class HWND extends HANDLE {
    }

    static interface Shell32 extends Library {

        public static final int MAX_PATH = 260;
        public static final int CSIDL_LOCAL_APPDATA = 0x001c;
        public static final int SHGFP_TYPE_CURRENT = 0;
        public static final int SHGFP_TYPE_DEFAULT = 1;
        public static final int S_OK = 0;

        static Shell32 INSTANCE = (Shell32) Native.loadLibrary("shell32",
                Shell32.class, OPTIONS);

        /**
         * see http://msdn.microsoft.com/en-us/library/bb762181(VS.85).aspx
         * 
         * HRESULT SHGetFolderPath( HWND hwndOwner, int nFolder, HANDLE hToken,
         * DWORD dwFlags, LPTSTR pszPath);
         */
        public int SHGetFolderPath(HWND hwndOwner, int nFolder, HANDLE hToken,
                int dwFlags, char[] pszPath);

    }

}

18voto

oxbow_lakes Punkte 131223

Andere haben die Frage bereits beantwortet, aber ein nützliches Programm zum Ausdrucken aller verfügbaren Eigenschaften ist:

for (Map.Entry<?,?> e : System.getProperties().entrySet()) {
    System.out.println(String.format("%s = %s", e.getKey(), e.getValue())); 
}

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