Mac Извлечь USB-диск из программы Java

Я пытаюсь извлечь флэш-накопитель USB на Mac из программы Java. Я пробовал umount и diskutil eject, и ни один из них не работает. Я получаю код выхода 1 от обоих. Если я физически вытащу диск, Mac OS X выдаст мне стандартное предупреждение.

Мой код:

log.debug( "going to eject targetRoot.getPath()=" + targetRoot.getPath() );
String command = "diskutil eject " + targetRoot.getPath().replace( " ", "\\ " );
log.debug( "about to run command=" + command );
int exitCode = Runtime.getRuntime().exec( command ).waitFor();
log.debug( "exitCode=" + exitCode );

Выход:

going to eject targetRoot.getPath()=/Volumes/NO NAME
about to run command=diskutil eject /Volumes/NO\ NAME
exitCode=1

На справочных страницах указано, что вы можете использовать смонтированный путь или путь к устройству в качестве аргумента для извлечения umount или diskutil.

Если скопирую команду в терминал и запущу, то работает отлично. Я подозреваю, что это связано с окружением, но, как видите, я не отправляю envp методу exec.

Что должен сделать программист, чтобы извлечение/размонтирование работало?

Спасибо!


person bmauter    schedule 09.09.2011    source источник


Ответы (1)


Пробовали ли вы использовать ProcessBuilder вместо Время выполнения.exec()? Он позволяет точно указать каждый из аргументов, а также позволяет создавать среду.

...или, по крайней мере, используйте форму Runtime.exec(), указывающий массив аргументов, а не строку.

Я предполагаю, что ваше экранирование пробелов не работает - удобная форма Runtime.exec() обрабатывает пробелы с помощью StringTokenizer и, вероятно, не так умен, как большинство оболочек.

person Jason S    schedule 09.09.2011
comment
Спасибо, это было! Я переключился на использование массива строк. Мне также пришлось удалить замену пробела на \ . - person bmauter; 09.09.2011