1

Os x でプログラムを実行中に、別のサブディレクトリにあるファイルを unrar する必要があります。フリーウェアのコマンド ライン ツール unrar を呼び出してこれを行います。これは非常にうまく機能します。ただし、unrar は常に現在の作業ディレクトリ内のファイルを unrar します。つまり、実行されたプロセスの作業ディレクトリを指定するか、.jar ホーム フォルダー内の解凍されたすべてのファイルを取得する必要があります。これは、processBuilder.directory(dir) を使用するか、runTime.getRuntime().exec(args,null,dir)たとえば dir がファイルの場合、簡単に実行できます。これはうまく機能しますが、作業ディレクトリにスペースが含まれている場合は機能しません。簡単な例として:

File dir=new File("/Users/chargedPeptide/rar 2");
String[] cmd = { "/Users/chargedPeptide/rar/unrar", "e", "-o+","/Users/chargedPeptide/rar", "2/weather.rar"};
Process pr = Runtime.getRuntime().exec(cmd,null,dir);
int exitValue=pr.waitFor();

使用中は機能しません:Process pr = Runtime.getRuntime().exec(cmd);代わりにコマンドを正常に起動しますが、jars 作業ディレクトリにすべてのファイルが残ります。代わりに processbuilder を使用し、 processbuilder.directory(dir);を使用してディレクトリを設定すると、次のメッセージが表示されて終了します。

Exception: Cannot run program "/Users/chargedPeptide/rar/unrar" (in directory "/Users/chargedPeptide/rar 2"): error=2, No such file or directory

ヘルプ?スペースを処理するにはどうすればよいですか? ファイルオブジェクトはそれらをパスの実際の部分のように扱うため、スペースの前にバックスラッシュを追加して文字通り役に立たないようにしました。

編集:全体をもう少し明確にするために:1.executeメソッドにコマンドとディレクトリをprocessbuilderに供給する別のメソッドがあります。すべてのディレクトリは前のメソッドによって検出され、存在します。これは、ディレクトリにスペースが含まれている場合を除いて機能します。2.作業ディレクトリを設定する必要があります。そうしないと、コマンドが間違った場所で実行されます。3. 次の方法でファイル オブジェクトを解析: dir=new File(dir.tostring.replace(" ","\ "); すべてのスペースの前にバックスラッシュを配置しても機能しません。 4. processbuilder の代わりに rt.exec を使用しても効果はありません。

どんなアイデアでも大歓迎です。

4

2 に答える 2

1

どうですか:

dir.mkdirs();

プロセスを開始する前に。

これにより、不足しているディレクトリが作成されます。

編集

これは奇妙に見えます。

String[] cmd = { "/Users/chargedPeptide/rar/unrar", "e", "-o+","/Users/chargedPeptide/rar", "2/weather.rar"};

これがシェルの場合は、次のように記述します。

unrar e -o+ "/Users/chargedPeptide/rar 2/weather.rar"

実際には、.rar ファイルを引用符で囲む必要があります。そうしないと、プロセスへの 2 つの引数として解釈されるためです。

「cmd」を分割した方法はまさにそれを行い、rar引数を2つに分割します。試す:

String[] cmd = { "/Users/chargedPeptide/rar/unrar", "e", "-o+","/Users/chargedPeptide/rar 2/weather.rar"};
于 2010-12-03T08:22:14.553 に答える
0

うまくいくかどうかわかりませんが、パスの最後に / を入れてみてください。つまり、

File dir=new File("/Users/chargedPeptide/rar 2/");
于 2010-12-03T08:26:30.717 に答える