Question

Je veux déterminer l'espace disque disponible sur Windows. Je ne me soucie pas que mon code est pas portable. J'utilise ceci:

String[] command = {"dir",drive};
Process process = Runtime.getRuntime().exec(command);
InputStream result = process.getInputStream();

visant à analyser le résultat d'un « dir C: » type d'appel, mais la chaîne que je reçois de l'appel en ligne de commande est comme si j'ai appelé dir avec une option /W (ne donnant aucune information sur la taille des fichiers ou l'utilisation du disque / espace libre). (Bien que lorsque je lance dir C: directement à partir de la ligne de commande, je reçois le résultat attendu, donc il n'y a pas dir configuration particulière sur mon système.) Essayer de passer un /-W jeton ou sur toute autre option ne semble pas fonctionner: Je viens d'obtenir la nom des dossiers / fichiers contenus dans le lecteur, mais aucune autre information que ce soit.

Quelqu'un connaît une solution / solution de contournement?

Remarque:

Je ne peux pas aller le long de la route fsutil, parce que fsutil ne fonctionne pas sur les lecteurs réseau.

Était-ce utile?

La solution

Il semble que votre exec() est de trouver un programme appelé « dir » quelque part dans votre chemin, car avec votre String[] command comme il est je le ferais autrement que vous attendez d'avoir une IOException (The system cannot find the file specified). La commande standard dir est intégré dans l'invite de commande cmd.exe et n'est pas un programme autonome, vous pouvez exécuter dans son propre droit.

Pour exécuter la commande dir intégrée dans cmd.exe vous devez utiliser le commutateur / c sur cmd.exe qui exécute la commande spécifiée puis quitte. Donc, si vous voulez exécuter:

cmd /c dir 

vos arguments à passer à exec serait:

String[] command = { "cmd", "/c", "dir", drive };

Autres conseils

Si vous ne se soucient pas de la portabilité, utilisez la méthode GetDiskFreeSpaceEx de l'API Win32. Enveloppez-le avec JNI et alto!

Votre code Java devrait ressembler à:

public native long getFreeSpace(String driveName);

et le reste peut se faire par l'exemple . Je pense que tout JNI a ses problèmes de performance, il est moins susceptible de provoquer la quantité de douleur que vous allez supporter en utilisant la classe Process ....

Apache Commons a FileSystemUtils.freeSpaceKb () qui fonctionnera croix platfrom etc etc

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top