Java: как определить дисковое пространство в системе Windows до 1.6 - PullRequest
1 голос
/ 07 августа 2009

Я хочу определить доступное дисковое пространство на окнах. Мне все равно, что мой код не является переносимым. Я использую это:

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

имеет целью проанализировать результат вызова типа "dir C:", но строка, которую я получаю из вызова командной строки, выглядит так, как будто я вызвал dir с параметром /W (не предоставляя никакой информации о размерах файла или использование диска / свободное место). (Хотя, когда я запускаю dir C: непосредственно из командной строки, я получаю ожидаемый результат, поэтому в моей системе нет dir особой настройки.) Попытка передать токен /-W или любой другой параметр кажется неэффективной. работа: я просто получаю названия папок / файлов, содержащихся на диске, но никакой другой информации.

Кто-то знает исправление / обходной путь?

Примечание:

Я не могу пройти по маршруту fsutil, потому что fsutil не работает на сетевых дисках.

Ответы [ 3 ]

3 голосов
/ 07 августа 2009

Похоже, что ваш exec() находит программу под названием "dir" где-то на вашем пути, потому что с вашим String[] command, как есть, я бы ожидал, что вы получите IOException (The system cannot find the file specified). Стандартная команда dir встроена в командную строку cmd.exe и не является отдельной программой, которую вы можете запускать самостоятельно.

Для запуска команды dir, встроенной в cmd.exe, необходимо использовать ключ / c на cmd.exe, который выполняет указанную команду и затем завершает работу. Так что если вы хотите выполнить:

cmd /c dir 

ваши аргументы для передачи в exec будут:

String[] command = { "cmd", "/c", "dir", drive };
1 голос
/ 07 августа 2009

Если вас не волнует переносимость, используйте метод GetDiskFreeSpaceEx из Win32 API. Оберните его, используя JNI и альт!

Ваш код Java должен выглядеть следующим образом:

public native long getFreeSpace(String driveName);

, а остальное можно сделать на примере здесь . Я думаю, что, хотя у JNI есть проблемы с производительностью, менее вероятно, что вы будете испытывать боль , которую вы будете испытывать , используя класс Process ....

0 голосов
/ 15 мая 2011

Apache Commons имеет FileSystemUtils.freeSpaceKb () , который будет работать между платформами и т. Д. И т. Д.

...