Runtime.exec () с абсолютным каталогом - PullRequest
4 голосов
/ 09 июля 2009

Я хотел бы использовать Runtime.exec () для запуска другого процесса в каталоге с пробелами. (Звучит глупо, но я действительно хочу удовлетворить свое любопытство)

Подробности проблемы (упрощенная версия) У меня myprogram.exe находится в C: / Program Files / MyProgram.

Что я наблюдаю: 1). когда я вызываю Runtime.exec («C: // Program Files // MyProgram // myprogram.exe»), IOException указывает: не удается найти файл C: / Program, с кодом ошибки = 2. Я думаю, что это должен быть результат пространства

2). Я попытался: Runtime.exec ("/" C: // Program Files // MyProgram // myprogram.exe / ""), IOException указывает: не могу найти файл: "C: / Program Files / MyProgram / myprogram. ехе "

3). Я усвоил урок и попробовал перегруженную версию Runtime.exec (): File dir = new File ("C: // Program Files // MyProgram //"); И запустите: Runtime.exec («myprogram.exe», null, dir), и он говорит: не могу найти файл myprogram.exe в C: / Program Files / MyProgram /

4). Я пробовал 1) вместо «Program Files» переименовываю в Program_Files, все работает

Я знаю, что могу также использовать ProcessBuilder, чтобы делать подобные вещи, но я не могу отпустить это в моем сердце ... (Возможно, это моя слабость). Может кто-нибудь сказать мне, почему 2) и 3) не работает?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 09 июля 2009

Несколько минут назад я увидел другой ответ, в области комментариев я наконец нашел способ его решить. Мне жаль, что я не знаю, как этот ответ был удален ... или кто дал ответ, комментируя ответ ...

ОБНОВЛЕНИЕ: в ходе дальнейшего расследования я обнаружил, что Мэтт Кейн дал правильный ответ, комментируя. Пожалуйста, позвольте мне выразить мою глубокую благодарность за вашу помощь. ;-)

Вот как я справился с этим согласно комментарию Мэтта и протестировал работу:

String[] cmdArray = new String[]{"C://Program Files//MyProgram//myprogram.exe", arg1, arg2};
Runtime.exec(cmdArray);

где arg1 и arg2 - это два параметра, передаваемых myprogram.exe

Использовать перегруженную версию exec ():

1) Process exec (String [] cmdarray)

2) Process exec (String [] cmdarray, String [] envp)

3) Process exec (String [] cmdarray, String [] envp, File dir)

Любой из них будет работать. Здесь я хотел бы упомянуть разницу между dir в 3) и абсолютным путем в cmdarray, который может быть "" C: // Program Files // MyProgram // "в моем случае.

В dir in 3) вы можете указать каталог, в котором вы запускаете .exe, все указанные вами относительные каталоги будут добавлены после этого dir. Пример: если ваш каталог C: / Hello World, и в вашем .exe вы собираетесь хранить файл в / folder1, наконец, вы найдете файл, расположенный в C: / Hello World / folder1

Однако dir не работает для исполняемого файла (в моем случае это myprogram.exe). Например, если ваш .exe находится в C: / Program Files / MyProgram /, и вы уже установили dir в C: / Program Files / MyProgram. Вы не можете успешно запустить программу без указания абсолютного пути к исполняемому файлу. В моем случае вы можете добиться успеха только через: cmdarray [0] = "C: // Программные файлы // MyProgram // myprogram.exe" Если вы ошиблись, ошибка будет выглядеть так: java.io.exception: не удается запустить программу «myprogram.exe» (в каталоге «C: / Program Files / MyProgram /»): ошибка CreateProcess = 2, система не может найти указанный файл. Обратите внимание, что в нем говорится только «невозможно запустить в ** каталоге» вместо «не удается найти файл в *** каталоге». Я думал, что это довольно смешно, но в любом случае, так оно и есть.

0 голосов
/ 24 февраля 2014

У меня была такая же проблема, и я решил ее, используя c: \ PROGRA ~ 1 вместо c: \ program files

0 голосов
/ 09 июля 2009

Попробуйте поставить обратную косую черту перед пробелом ... "C: / Program \ and \ Files / MyProgram / myprogram.exe"

вы должны использовать двойную обратную косую черту, чтобы она передавалась в ОС.

Если это не сработает, попробуйте "C: / \" Программа и файлы \ "/ MyProgram / myprogram.exe"

...