La difficulté est qu'elle doit être multiplateforme. Windows 2000, XP, Vista, OSX, Linux, autres variantes Unix. Je recherche un extrait de code qui peut accomplir cela pour toutes les plates-formes et un moyen de détecter la plate-forme.
Maintenant, vous devez être conscient du bogue 4787931 qui user.home
ne fonctionne pas correctement, alors ne me fournissez pas de réponses de manuel, je peux les trouver moi-même dans les manuels.
java
cross-platform
home-directory
Bruno Ranschaert
la source
la source
Réponses:
Le bogue auquel vous faites référence (bogue 4787391) a été corrigé dans Java 8. Même si vous utilisez une ancienne version de Java, l'
System.getProperty("user.home")
approche est probablement toujours la meilleure. L'user.home
approche semble fonctionner dans un très grand nombre de cas. Une solution 100% pare-balles sur Windows est difficile, car Windows a un concept changeant de ce que signifie le répertoire personnel.Si cela
user.home
ne vous convient pas, je suggère de choisir une définition dehome directory
pour Windows et de l'utiliser, en obtenant la variable d'environnement appropriée avecSystem.getenv(String)
.la source
En fait, avec Java 8, la bonne façon est d'utiliser:
Le bogue JDK-6519127 a été corrigé et la section "Incompatibilités entre JDK 8 et JDK 7" des notes de version indique:
Bien que la question soit ancienne, je laisse cela pour référence future.
la source
Voir JavaDoc .
la source
Le concept d'un répertoire HOME semble être un peu vague en ce qui concerne Windows. Si les variables d'environnement (HOMEDRIVE / HOMEPATH / USERPROFILE) ne suffisent pas, vous devrez peut-être recourir à des fonctions natives via JNI ou JNA . SHGetFolderPath vous permet de récupérer des dossiers spéciaux, comme Mes documents (CSIDL_PERSONAL) ou Paramètres locaux \ Données d'application (CSIDL_LOCAL_APPDATA).
Exemple de code JNA:
la source
D'autres ont répondu à la question avant moi, mais un programme utile pour imprimer toutes les propriétés disponibles est:
la source
Comme je cherchais la version Scala, tout ce que j'ai pu trouver était le code JNA de McDowell ci-dessus. J'inclus mon port Scala ici, car il n'y a actuellement aucun endroit plus approprié.
Comme pour la version Java, vous devrez ajouter Java Native Access , y compris les deux fichiers jar, à vos bibliothèques référencées.
C'est agréable de voir que la JNA rend maintenant cela beaucoup plus facile que lorsque le code d'origine a été publié.
la source
J'utiliserais l'algorithme détaillé dans le rapport de bogue en utilisant System.getenv (String), et je préférerais utiliser la propriété user.dir si aucune des variables d'environnement n'indiquait un répertoire existant valide. Cela devrait fonctionner sur plusieurs plates-formes.
Je pense que sous Windows, ce que vous cherchez vraiment, c'est le répertoire "documents" théorique de l'utilisateur.
la source
Une alternative serait d'utiliser Apache CommonsIO
FileUtils.getUserDirectory()
au lieu deSystem.getProperty("user.home")
. Cela vous donnera le même résultat et il n'y a aucune chance d'introduire une faute de frappe lors de la spécification de la propriété système.Il y a de fortes chances que vous ayez déjà la bibliothèque Apache CommonsIO dans votre projet. Ne l'introduisez pas si vous prévoyez de l'utiliser uniquement pour obtenir le répertoire personnel de l'utilisateur.
la source
Si vous voulez quelque chose qui fonctionne bien sur Windows, il existe un package appelé WinFoldersJava qui encapsule l'appel natif pour obtenir les répertoires «spéciaux» sur Windows. Nous l'utilisons fréquemment et cela fonctionne bien.
la source