366 votes

Quelle est la meilleure façon de trouver le répertoire utilisateurs dans Java ?

La difficulté est qu’il doit être multi-plateforme. Windows 2000, XP, Vista, OSX, Linux, autres variantes d’unix. Je cherche un extrait de code qui peut accomplir ceci pour toutes les plates-formes et un moyen de détecter la plate-forme.

Maintenant, vous devriez être au courant du bug 4787931 qui `` ne fonctionne pas correctement, donc s’il vous plaît ne me donnent pas de réponses de manuel, je peux trouver ces moi-même dans les manuels.

468voto

DJClayworth Points 11288

Depuis que vous avez spécifiquement mention bug 4787391 je suppose que vous n'êtes pas satisfait avec l' System.getProperty("user.home") fonctionnalités. Êtes-vous sûr?
L' user.home approche semble fonctionner dans un très grand nombre de cas. Si vous avez lu la page du bug , vous trouverez que les 100% à l'épreuve des balles solution sur Windows est dur, parce que Windows a un changement de concept de ce qu'est le home directory de moyens.

Si user.home n'est pas assez bon pour vous, je voudrais vous suggérons de choisir une définition de l' home directory pour windows et en utilisant correctement variable d'environnement System.getenv(String).

43voto

Joachim Sauer Points 133411
<pre><code></code><p><a href="http://java.sun.com/javase/6/docs/api/java/lang/System.html#getProperties%28%29">JavaDoc</a>.</p></pre>

32voto

McDowell Points 62645

La notion de répertoire d'ACCUEIL semble être un peu vague quand il s'agit de Windows. Si les variables d'environnement (HOMEDRIVE/HOMEPATH/USERPROFILE) ne sont pas assez, vous pouvez avoir à recourir à l'aide de fonctions natives via JNI ou de la JNA. SHGetFolderPath vous permet de récupérer des dossiers spéciaux, comme Mes Documents (CSIDL_PERSONAL) ou Local Settings\Application Data (CSIDL_LOCAL_APPDATA).

Exemple 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 Points 70013

D’autres ont répondu à la question avant moi, mais est un programme utile pour imprimer toutes les propriétés disponibles :

2voto

Lawrence Dol Points 27976

Je voudrais utiliser l’algorithme détaillé dans le rapport de bogue à l’aide de System.getenv(String) et secours à l’aide de la propriété user.dir si aucune des variables d’environnement indique un répertoire existant valide. Cela devrait fonctionner multi-plateforme.

Je pense que, sous Windows, ce que vous êtes vraiment après est répertoire de « documents » théorique de l’utilisateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X