Java: come determinare lo spazio su disco sul sistema di Windows precedenti a 1.6
Domanda
Voglio determinare lo spazio disponibile sul disco di Windows. Non mi interessa che il mio codice non è portabile. Io uso questo:
String[] command = {"dir",drive};
Process process = Runtime.getRuntime().exec(command);
InputStream result = process.getInputStream();
Con l'obiettivo di analizzare il risultato di una "dir C:" tipo di chiamata, ma la stringa ricevo dalla chiamata linea di comando è come se ho chiamato dir con un'opzione /W
(non dare alcuna informazione sulle dimensioni di file o l'utilizzo del disco / spazio libero). (Anche se quando mi lancio dir C:
direttamente dalla linea di comando, ottengo il risultato atteso, quindi non c'è dir
configurazione particolare sul mio sistema.) Cercando di passare un /-W
di token o su qualsiasi altra opzione sembra non funzionare: Ho appena ottenere il nome delle cartelle / file contenuti nel disco, ma nessun'altra informazione di sorta.
Qualcuno conosce un fix / workaround?
Nota:
Non posso andare lungo il percorso fsutil
, perché fsutil
non funziona su unità di rete.
Soluzione
Sembra che il tuo exec()
è trovare un programma chiamato "dir" da qualche parte nel vostro percorso perché con il vostro String[] command
in quanto è lo farei altrimenti si aspettano di ottenere una IOException (The system cannot find the file specified)
. Il comando standard dir è integrato nel prompt dei comandi cmd.exe e non è un programma standalone è possibile eseguire a sé stante.
Per eseguire il comando dir integrato in cmd.exe è necessario utilizzare l'opzione / c su cmd.exe, che esegue il comando specificato e poi esce. Quindi, se si desidera eseguire:
cmd /c dir
tuoi argomenti da passare a exec potrebbe essere:
String[] command = { "cmd", "/c", "dir", drive };
Altri suggerimenti
Se non si cura di portabilità, utilizzare il GetDiskFreeSpaceEx metodo da API Win32. Avvolgere utilizzando JNI, e viola!
Il codice Java dovrebbe essere simile:
public native long getFreeSpace(String driveName);
e il resto può essere fatto attraverso l'esempio qui . Penso che mentre JNI ha i suoi problemi di prestazioni, è meno probabile che a causare la quantità di dolore ti sopportare utilizzando la classe Process ....
Apache Commons ha FileSystemUtils.freeSpaceKb () che lavorerà platfrom croce etc etc