web-dev-qa-db-fra.com

Obtenir le chemin de mes documents en Java

J'ai besoin de trouver le chemin de mes documents en utilisant Java. Le code suivant ne me donne pas une loation "précise"

System.getProperty("user.home");

Quel devrait être l'inverse?

P.S: Je ne veux pas utiliser le truc sale de JFileChooser.

22
Em Ae

Vous pouvez l'obtenir en utilisant une requête de registre, vous n'avez pas besoin de droits JNA ou d'administrateur pour cela.

Runtime.getRuntime().exec("reg query \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell 
Folders\" /v personal");

Évidemment, cela échouera sur autre chose que Windows, et je ne suis pas certain que cela fonctionne pour Windows XP.

EDIT: Mettez ceci dans une séquence de code:

String myDocuments = null;

try {
    Process p =  Runtime.getRuntime().exec("reg query \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\" /v personal");
    p.waitFor();

    InputStream in = p.getInputStream();
    byte[] b = new byte[in.available()];
    in.read(b);
    in.close();

    myDocuments = new String(b);
    myDocuments = myDocuments.split("\\s\\s+")[4];

} catch(Throwable t) {
    t.printStackTrace();
}

System.out.println(myDocuments);

Notez que cela verrouille le processus jusqu'à ce que la "requête de registre" soit terminée, ce qui pourrait causer des problèmes en fonction de ce que vous faites.

9
pdinklag

C'est facile, JFileChooser le trouve pour vous

new JFileChooser().getFileSystemView().getDefaultDirectory().toString();

J'espère que ça aidera quelqu'un

27
xchiltonx

Puisque la réponse la plus votée de @xchiltonx utilise JFileChooser, j'aimerais ajouter que, en ce qui concerne les performances, ceci est plus rapide que d'utiliser JFileChooser:

FileSystemView.getFileSystemView().getDefaultDirectory().getPath()

Dans mon PC, JFileChooser aproach avait besoin de 300 ms et appeler FileSystemView avait directement besoin de moins de 100 ms.

Note: La question est un doublon possible de Comment trouver le dossier «Mes documents» en Java

17
IvanRF

En utilisant la JNA, vous feriez ceci:

String myDocsPath = Shell32Util.getFolderPath(ShlObj.CSIDL_PERSONAL);

La JNA extrait une DLL à la volée, puis utilise JNI avec cette DLL pour effectuer des appels API Windows. Il cache cependant tous les détails JNI. Utiliser JNA est aussi simple que d’utiliser un autre JAR de bibliothèque Java.

2
Sarel Botha

"user.home" renvoie le répertoire de base de l'utilisateur, et non le dossier "Mes documents" . Sous Windows, il s'agirait de "C:\Utilisateurs\Nom d'utilisateur \" pour Vista ou 7, ou "C:\Documents and Settings\Nom d'utilisateur "pour XP

Ce que tu veux c'est:

System.out.println(System.getProperty("user.home") + File.separatorChar + "My Documents");
1
nbarraille

Le meilleur moyen que j'ai trouvé est d'utiliser les AWT:

ShellFolder.get("fileChooserDefaultFolder");

J'ai redirigé mon dossier Documents vers le lecteur D: et ce répertoire a été extrait avec succès. Cela prend également environ 40 ms (sur ma machine). Utiliser FileSystemView prend environ 48 ms et new JFileChooser() environ 250 ms. 

Ces trois méthodes utilisent en réalité ShellFolder sous le capot, et la différence avec FileSystemView est négligeable, mais l’appeler directement évite les frais généraux des deux autres.

Remarque: Vous pouvez également convertir ceci directement en File au lieu d’obtenir implicitement la méthode toString(), ce qui peut vous aider davantage:

File documents = (File) ShellFolder.get("fileChooserDefaultFolder");
0
Magnus Bull

c’est ce que fait Eclipse pour obtenir le dossier du document utilisateur. 

System.getProperty("user.dir") //$NON-NLS-1$
                    + File.separator + "workspace")

J'espère que c'est utile!

0
TuanAnh207