2013-07-23 1 views
0

У меня есть следующие Java-код для запуска родной EXE-файл Windows, используя ProcessBuilderИспользование Java ProcessBuilder для запуска родной Windows, .exe ошибки продуцирующие :: Имя каталога недействителен

public class HMetis { 
    private String exec_name = null;  
    private String[] hmetis_args = {"hmetis.exe", "null", "2", "1", "10", "1", "1", "1", "0", "0"}; 

    private Path path; 
    private File file; 

    public HMetis(String hgraph_exec, String hgraph_file) { 
     this.exec_name = hgraph_exec;  
     this.hmetis_args[1] = hgraph_file; 
    }  

    public void runHMetis() throws IOException {  
     this.path = Paths.get("C:\\hMetis\\1.5.3-win32"); 
     this.file = new File(path+"\\"+this.exec_name+".exe");  

     ProcessBuilder pb = new ProcessBuilder(this.hmetis_args); 
     pb.directory(this.file); 

     try {  
      Process process = pb.start();      
     } finally { 
      // do nothing 
     } 
    } 
} 

после выполнения этого кода я нахожусь получив ошибку ниже, хотя из сообщения кажется, что имя каталога полностью сформировано и ОК! Любые предложения, пожалуйста?

Cannot run program "hmetis.exe" (in directory "C:\hMetis\1.5.3-win32\hmetis.exe"):CreateProcess error=267, The directory name is invalid 
+0

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

+3

Возможный дубликат [Запуск Windows .exe-файла с несколькими аргументами с использованием Java ProcessBuilder не создает никакого выходного файла, как ожидалось) (http://stackoverflow.com/questions/17809295/running-windows-exe-file-with-multiple- arguments-using-java-processbuilder-is-n) Отредактируйте свой более ранний вопрос, а не создавайте новые сообщения об одной и той же проблеме. Вы также, кажется, проигнорировали мой совет, который я вам посоветовал. Так почему же этот дублирующий вопрос будет другим? –

+0

@ Нельзя дублировать эти два случая - это два разных случая с различными наблюдениями. Ранее заданный вопрос говорит, что файл .exe работает, не создавая сообщения об ошибке, но файл .exe не работает так, как ожидается. – joarderm

ответ

1

Вы используете полный путь к исполняемому файлу в качестве рабочего каталога ProcessBuilder в:

this.file = new File(path+"\\"+this.exec_name+".exe");  
ProcessBuilder pb = new ProcessBuilder(this.hmetis_args); 
pb.directory(this.file); 
        ^
        | 
        ++++++++ "C:\hMetis\1.5.3-win32\hmetis.exe" 
          should be "C:\hMetis\1.5.3-win32" 

Однако, вы хотите установить рабочую каталог только, как

pb.directory(this.path.toFile()); 

Кроме того, кажется, что ProcessBuilder.directory() не устанавливает «рабочий каталог», как можно было бы ожидать - по крайней мере, чтобы не найти исполнятеля ле. Аналогичная проблема описана в ProcessBuilder can't find file?!. По крайней мере, в Windows обычно исполняются исполняемые файлы в текущем рабочем каталоге (Unix - это другое дело).

легко исправить было бы добавить абсолютное имя пути в массив команд, как

String[] hmetis_args = {"C:\\hMetis\\1.5.3-win32\\hmetis.exe", "null", "2", "1", "10", "1", "1", "1", "0", "0"}; 

Смотрите также

+0

pb.directory() ожидает, что объект File поэтому задает pb.directory (this.path) создает ошибку – joarderm

+1

Вы можете преобразовать объект 'Path' в' File' - см. мой обновленный ответ. Вероятно, более простым решением было бы использовать непосредственно объект «Файл». Объект «Файл» также может представлять каталог –

+0

после покрытия path.toFile(). Я получаю следующую ошибку: Исключение в потоке «главная» java .io.IOException: Не удается запустить программу «hmetis.exe» (в каталоге «C: \ hMetis \ 1.5.3-win32»): Ошибка CreateProcess = 2, система не может найти указанный файл – joarderm

0

Вы пытались заменить
pb.directory(this.file);
с
pb.directory(this.file.getParentFile());?

+0

pb.directory() ожидает объект File, поэтому установка pb.directory (this.path) вызывает ошибку – joarderm

+0

, делая так, как вы предложили произвести ошибку ниже: Каталог методов (Файл) в типе ProcessBuilder не применим для аргументы (String) – joarderm

Смежные вопросы