Выполнение внешнего исполняемого файла в рабочем каталоге, содержащем пробелы в Java? - PullRequest
1 голос
/ 03 декабря 2010

У меня есть особая потребность в удалении файлов, найденных в разных подкаталогах, во время выполнения моей программы на Os x.Я делаю это, вызывая бесплатный инструмент командной строки unrar, который работает очень хорошо.Тем не менее, unrar всегда будет разархивировать файлы в текущем рабочем каталоге, что означает, что я должен указать рабочий каталог для выполняемого процесса или получить каждый распакованный файл в моей домашней папке .jar.Это достаточно просто сделать с помощью processBuilder.directory (dir) или runTime.getRuntime().exec(args,null,dir), например, где dir - это файл.Это работает отлично, но не тогда, когда в рабочем каталоге есть пробел.В качестве короткого примера:

File dir=new File("/Users/chargedPeptide/rar 2");
String[] cmd = { "/Users/chargedPeptide/rar/unrar", "e", "-o+","/Users/chargedPeptide/rar", "2/weather.rar"};
Process pr = Runtime.getRuntime().exec(cmd,null,dir);
int exitValue=pr.waitFor();

Не будет работать, при использовании: Process pr = Runtime.getRuntime().exec(cmd); вместо этого успешно запустит команду, но оставит меня со всеми файлами в рабочем каталоге jars.Вместо этого используйте processbuilder и p rocessbuilder.directory(dir); для установки выхода из каталога с сообщением:

Exception: Cannot run program "/Users/chargedPeptide/rar/unrar" (in directory "/Users/chargedPeptide/rar 2"): error=2, No such file or directory

Help?Как мне справиться с пробелами?Я попытался добавить обратную косую черту перед пробелами, чтобы сделать их буквально бесполезными, поскольку объект File обрабатывает их как фактическую часть пути.

Редактировать: Чтобы сделать все немного более понятным: 1. У меня естьотдельный метод, который передает методу execute команду и каталог в processbuilder, все каталоги найдены предыдущим методом и существуют.Это работает за исключением случаев, когда каталог содержит пробел.2. Мне нужно установить рабочий каталог, иначе команда будет выполнена не в том месте.3.Парсинг файлового объекта с помощью: dir = new File (dir.tostring.replace ("", "\"); поместить обратную косую черту перед всеми пробелами не работает, поскольку объект File java затем ищет путь, содержащийфактическая обратная косая черта. Не повезло. 4. Использование rt.exec вместо processbuilder также не помогло.

Любые идеи, которые приветствуются.

Ответы [ 2 ]

1 голос
/ 03 декабря 2010

Как насчет:

dir.mkdirs();

перед запуском процесса.

Это создает отсутствующий каталог.

Редактировать :

Это выглядит странно.

String[] cmd = { "/Users/chargedPeptide/rar/unrar", "e", "-o+","/Users/chargedPeptide/rar", "2/weather.rar"};

Если бы это была оболочка, вы бы написали:

unrar e -o+ "/Users/chargedPeptide/rar 2/weather.rar"

На самом деле вы должны поместить файл .rar в кавычки, так как в противном случае он будетинтерпретировать как 2 аргумента процесса.

То, как вы разбили 'cmd', сделает именно это, разбейте аргумент rar на две части.Попробуйте:

String[] cmd = { "/Users/chargedPeptide/rar/unrar", "e", "-o+","/Users/chargedPeptide/rar 2/weather.rar"};
0 голосов
/ 03 декабря 2010

Не уверен, что это будет работать, но вы можете попробовать поставить / в конце пути. то есть.,

File dir=new File("/Users/chargedPeptide/rar 2/");
...