0

ProcessBuilder を使用してネイティブ Windows .exe ファイルを実行する次の Java コードがあります。

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
        }
    }
}

このコードを実行した後、次のエラーが表示されますが、メッセージからはディレクトリ名が完全に形成されているようで、OK !! 何か提案はありますか?

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

2 に答える 2

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"};

こちらもご覧ください

于 2013-07-23T12:14:30.060 に答える
0

に置き換えようとしまし
pb.directory(this.file);

pb.directory(this.file.getParentFile());か?

于 2013-07-23T12:13:23.470 に答える