Ubuntu 10.04ターミナルで「cd」コマンドを使用してディレクトリを変更しようとするスタンドアロンJavaアプリケーションを作成しました。次のコードを使用しました。
String[] command = new String[]{"cd",path};
Process child = Runtime.getRuntime().exec(command, null);
しかし、上記のコードでは次のエラーが発生します
Exception in thread "main" Java.io.IOException: Cannot run program "cd": Java.io.IOException: error=2, No such file or directory
誰でもそれを実装する方法を教えてもらえますか?
cd
と呼ばれる実行可能ファイルはありません。これは、が別のプロセスで実装できないためです。
問題は、各プロセスに独自の現在の作業ディレクトリがあり、cd
を個別のプロセスとして実装すると、変更されるthatが現在の作業ディレクトリ。
Javaプログラムでは、)できない現在の作業ディレクトリを変更できます。絶対ファイルパス。
現在の作業ディレクトリが重要なケースの1つは、外部プロセスの実行(ProcessBuilder
またはRuntime.exec()
を使用)です。これらの場合、新しく開始されたプロセスに使用する作業ディレクトリを明示的に指定できます( ProcessBuilder.directory()
および three-argument Runtime.exec()
それぞれ)。
注:現在の作業ディレクトリは、 システムプロパティから読み取ることができますuser.dir
。 setそのシステムプロパティに誘惑されるかもしれません。これを行うと、 非常に悪い不整合 につながることに注意してください。これは、 が書き込み可能でないmeantではないためです .
以下のリンクを参照してください(これはその方法を説明しています):
http://alvinalexander.com/Java/edu/pj/pj010016
すなわち:
String[] cmd = { "/bin/sh", "-c", "cd /var; ls -l" };
Process p = Runtime.getRuntime().exec(cmd);
Java Runtimeの場合、このexecコマンドを調査しました。 "cd"するパスでファイルオブジェクトを作成し、execメソッドの3番目のパラメーターとして入力します。
public Process exec(String command,
String[] envp,
File dir)
throws IOException
指定された環境と作業ディレクトリを使用して、指定された文字列コマンドを別のプロセスで実行します。
これは便利な方法です。 exec(command、envp、dir)という形式の呼び出しは、exec(cmdarray、envp、dir)の呼び出しとまったく同じように動作します。cmdarrayはcommand内のすべてのトークンの配列です。
より正確には、文字列をさらに変更することなく、new StringTokenizer(command)の呼び出しによって作成されたStringTokenizerを使用して、コマンド文字列がトークンに分割されます。トークナイザーによって生成されたトークンは、新しい文字列配列cmdarrayに同じ順序で配置されます。
Parameters:
command - a specified system command.
envp - array of strings, each element of which has environment variable settings in the format name=value, or null if the subprocess should inherit the environment of the current process.
dir - the working directory of the subprocess, or null if the subprocess should inherit the working directory of the current process.
Returns:
A new Process object for managing the subprocess
Throws:
SecurityException - If a security manager exists and its checkExec method doesn't allow creation of the subprocess
IOException - If an I/O error occurs
NullPointerException - If command is null, or one of the elements of envp is null
IllegalArgumentException - If command is empty
このコマンドはうまく機能します
Runtime.getRuntime().exec(sh -c 'cd /path/to/dir && ProgToExecute)
使用してみてください:
Runtime.getRuntime.exec("cmd /c cd path");
これは機能しました
Runtime r = Runtime.getRuntime();
r.exec("cmd /c pdftk C:\\tmp\\trashhtml_to_pdf\\b.pdf C:\\tmp\\trashhtml_to_pdf\\a.pdf cat output C:\\tmp\\trashhtml_to_pdf\\d.pdf");
以下は機能しませんでした配列コマンドの使用中に機能しませんでした
String[] cmd = {"cmd /c pdftk C:\\tmp\\trashhtml_to_pdf\\b.pdf C:\\tmp\\trashhtml_to_pdf\\a.pdf cat output C:\\tmp\\trashhtml_to_pdf\\d.pdf"}; r.exec(cmd);
FYIは、上記のウィンドウがウィンドウ以外で機能するかどうかを確認するためにユーティリティを使用しています。removecmdおよび/ c
プロセスビルダーのメソッドの1つを使用して、cmdが実行されると予想されるディレクトリを渡すことができます。以下の例をご覧ください。また、メソッドの待機を使用して、プロセスのタイムアウトに言及することができます。
ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", cmd).directory(new File(path));
Process p = builder.start();
p.waitFor(timeoutSec, TimeUnit.SECONDS);
上記のコードでは、パスのファイルオブジェクト(cmdが実行されると予想される場所)をProcessBuilderのディレクトリメソッドに渡すことができます。
Javaアプリケーションが同じディレクトリにあるshスクリプトを実行し、shスクリプトで "cd"を実行することでこれを解決しました。
ターゲットアプリケーションが適切に動作するように、特定のディレクトリに対して「cd」を実行する必要がありました。