2010-11-06 7 views
13

Per qualsiasi motivo, a volte ho bisogno di trovare la cartella Documenti dell'utente corrente su Windows in un programma Java per leggere alcuni file. Ma per quanto posso dire, non c'è modo di farlo che non sia gravemente imperfetto.Metodo corretto per trovare la cartella Documenti dell'utente su Windows con Java?

Il primo modo errato: System.getProperty ("user.home");
Perché non funzionerà:

  • Esso restituisce solo la cartella \ nomeutente \; Avrei bisogno di aggiungere "\ Documenti \" alla fine per ottenere la cartella Documenti ... e che funziona solo in inglese.
  • Sun bugs 6519127 e 4787931. Java trova la cartella home dell'utente su Windows leggendo una chiave di registro deprecata * per trovare il Desktop e quindi il padre; questo metodo ha più problemi noti che possono facilmente restituire una cartella completamente sbagliata. I bug sono 3.75 anni e 8 anni senza correzioni.

Il secondo modo errato: Utilizzare un programma di lettura del Registro di sistema per ottenere la cartella Personale dell'utente, che è Documenti (ma i18n'd).
Perché non funziona:
Mentre corregge il problema solo in inglese, sta ancora utilizzando la stessa area di registro deprecata, quindi i bug si applicano ancora ad esso.

La chiave di registro deprecata dice di utilizzare una chiamata nativa (SHGetKnownFolderPath) che ovviamente non posso fare da Java.

Il terzo modo sbagliato:

JFileChooser fr = new JFileChooser(); 
FileSystemView fw = fr.getFileSystemView(); 
File documents = fw.getDefaultDirectory(); 

Perché non funziona: funziona benissimo!
Tranne quando non lo fa. Mentre avevo un programma che usava questo aperto e funzionante in background, ho aperto un gioco DirectX (Fallout: New Vegas). Il programma Java immediatamente termina senza traccia dello stack. Sempre riproducibile (per me in quel gioco, e chissà cos'altro). Impossibile trovare il sole # bug.

Quindi esiste un metodo per trovare la cartella Documenti di un utente, su Windows, da Java, che non ha problemi noti?

(Questo è un bel grande domanda.)

* (La chiave è "HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Shell Folders")

+0

Uguale [come trovare “My Documents” cartella ] (http://stackoverflow.com/questions/1503555/how-to-find-my- documenti-cartella). Si parla winfoldersjava, un wrapper JNI intorno SHGetSpecialFolderPath. Poiché stai utilizzando la funzionalità specifica di Windows, JNI dovrebbe essere a posto. –

+1

Hai davvero isolare questi arresti per il frammento di codice dalla terza via? Perché questo metodo sembra essere usato da sbalzi propria finestra di dialogo Apri file (JFileChooser) così sembra un sacco di applicazioni Java avrebbe sofferto da esso? –

+0

http://stackoverflow.com/questions/1503555/how-to-find-my-documents-folder –

risposta

-1

user.home non è "i miei documenti", ma la cartella home dell'utente, come in Unix ~ /. Per arrivare a "I miei documenti" è possibile utilizzare System.getProperty ("user.home") + "\ Documents"; indipendentemente dal sistema linguistico. Provalo.

+0

ha già dichiarato che egli è bisogno di un supporto multilingue - questo non funzionerà. –

+0

Anche questo non funziona anche senza l'inglese-unico problema; come ho sottolineato nella mia domanda, Java usa una chiave di registro deprecata per trovare user.home. Potrebbe non riuscire sui profili di roaming, su un aggiornamento XP-> Vista, se l'utente ha rinominato la cartella Desktop, ecc. (È possibile che siano state fornite correzioni parziali, ma nel complesso è rotto) –

+0

Si prega di non pubblicare risposte che causano più problemi di quello che risolvono. –

3

un dispendio di tempo, ma in modo affidabile di trovare la cartella di un utente di Windows il 'Documenti': Fai la tua Java App eseguire uno script bat che utilizza Reg.exe (un file di sistema di Windows) per trovare il valore della chiave del registro che ha il percorso in esso. Quindi utilizzare una pipeline nello stesso file bat per inviare quei dati alla funzione 'findstr' che il prompt dei comandi di Windows ha. Utilizzare un'altra pipeline per inviare il valore restituito a un file di testo. Quindi, fai in modo che la tua app java legga quel file di testo e la cancelli una volta terminata :) Ha funzionato abbastanza bene per me.

codice per il file bat:

@ echo off 

Title Find Documents Folder 

Reg Query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" |findstr "Personal">>DocPath.dat 

exit 
Problemi correlati