Java: копирование exe-файла и последующий запуск не удается - PullRequest
1 голос
/ 20 мая 2010

Я хочу скопировать существующий .exe-файл из одного каталога в другой и затем запустить его с помощью Java. Как это:

FileIO.copy( new File( sourceFile ), new File( targetFile ) );
System.out.println( "Existing: " + new File( targetFile ).exists() );
System.out.println( "Launching " + targetFile );
String cmd[] = { targetFile };
Process p = Runtime.getRuntime().exec( cmd );
p.waitFor();
System.out.println( "Result: " + p.exitValue() );

Вывод выглядит так:

Existing: true
Launching C:\test\Launcher.new.exe
Result: 2

Итак, Java говорит, что файл действителен и существует, но Windows просто не может запустить процесс, потому что считает, что файла там нет. Пути абсолютно и с обратным слешем. У меня также есть все разрешения на файлы, поэтому я могу их выполнять. Launcher.new.exe создается Launch4j, поэтому он более или менее автономен. По крайней мере, это не зависит от DLL в той же папке. Но странно: это работает, когда я копирую и запускаю notepad.exe.

Еще одна странная вещь: если я не копирую файл с помощью Java, а вручную, запуск также завершается с той же ошибкой.

ОС - это Vista с SP1.

Любая подсказка?

Ответы [ 3 ]

0 голосов
/ 20 мая 2010

Если ваш путь содержит косые черты, вы можете попробовать изменить их на обратную косую черту перед exec ing.Кроме того, вы должны попытаться сделать путь абсолютным, включая букву диска и двоеточие (например, C:\test\myprog.exe).Обратите внимание, что если вы кодируете путь в строке Java, вам нужно удвоить обратную косую черту ...

Как только вы это заработаете, вы можете ослабить эти ограничения, пока не выясните, что сломало вашу попытку.


РЕДАКТИРОВАТЬ 1: Некоторые распространенные ошибки с exec() упоминаются в этой статье .Я не думаю, что что-то из этого применимо, но вы можете использовать код из последнего примера, чтобы запустить ваш .EXE в CMD.EXE, чтобы получить достойное разрешение пути, обработку ошибок и тому подобное.


РЕДАКТИРОВАТЬ 2: Ваше имя исполняемого файла должно интерпретироваться как длинное имя файла.Я не уверен, что API может / справится с этим.Пожалуйста, попробуйте дать .EXE короткое, простое имя (только для тестирования), например NEWPROG.EXE (без второй точки в имени!) Но сначала обязательно попробуйте сначала CMD.EXE.


РЕДАКТИРОВАТЬ 3: Из чтения комментариев к другому ответу: Возможно ли, что ваша программа действительно работает и сама возвращает статус 2, потому что она не может найти файл?Есть ли какой-нибудь способ проверить работу вашей программы, возможно, вызвав ее из пакетного скрипта .CMD, который вы запускаете из вашей Java-программы, и сделав запись перенаправленного вывода в файл?

0 голосов
/ 20 мая 2010

Без подробностей сложно дать конкретный ответ. Проверьте свои разрешения для каталога c: \ test и разрешения для целевого файла, который вы пытаетесь выполнить.

0 голосов
/ 20 мая 2010

Хм ... Интересно, может ли это быть замечательный пользовательский контроль доступа Vista в игре ...

Работаете ли вы в Program Files? Если это так, переместите все в отдельную папку (c: \ CopyTest) и попробуйте снова - посмотрите, поможет ли это ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...