Runtime.exec() с абсолютным каталогом

Я хотел бы использовать 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. EXE"

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) не работает?

Спасибо.


person Lily    schedule 09.07.2009    source источник
comment
Вы уверены, что имя вашей папки не c:\Program_and_Files?   -  person Jack Leow    schedule 09.07.2009
comment
C:/Program *and* Files/ ? В большинстве систем он называется C:/Program Files — вы точны в своем сообщении?   -  person Vinay Sajip    schedule 09.07.2009
comment
извините, ребята, это опечатка. Я уже меняю их на Program Files...   -  person Lily    schedule 09.07.2009


Ответы (3)


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

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

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

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

где arg1 и arg2 — два параметра, передаваемые в myprogram.exe

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

1)Процесс exec(String[] cmdarray)

2) Процесс exec (String [] cmdarray, String [] envp)

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

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

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

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

person Lily    schedule 09.07.2009
comment
Хм, кажется, это было мое предложение. Не знаю, куда делся ответ. - person Matt K; 09.07.2009
comment
Хммм, я полагаю, просто опечатка, но вам лучше написать: ... new String[]{C:\\Program Files\\... То есть двойная обратная косая черта - person Michael Zilbermann; 09.07.2009
comment
@ zim2001 zim2001, это не опечатка ... похоже на ошибку форматирования в stackoverflow? Я написал каждый // и когда я его публикую, каждый // переходит в /... - person Lily; 10.07.2009
comment
Соооооооо, что опять ответили? - person OscarRyz; 10.07.2009
comment
@Oscar, вот оно: String[] cmdArray = new String[]{C://Program Files//MyProgram//myprogram.exe, arg1, arg2}; Время выполнения.exec(cmdArray); где arg1 и arg2 — два параметра, передаваемые в myprogram.exe - person Lily; 10.07.2009

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

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

Если это не сработает, попробуйте "C:/\"Program and Files\"/MyProgram/myprogram.exe"

person Chochos    schedule 09.07.2009

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

person Gonen I    schedule 24.02.2014