0

私はいくつかのコンソールユーティリティを持っています。いくつかのパラメータを使用してこのユーティリティを実行するプロセスを開始します。1つのパラメータはファイル名です。

ファイル名にスペースが含まれていない場合、すべて機能します。しかし、スペースがあると、ユーティリティからエラーが発生します:「そのようなファイルまたはディレクトリはありません」。ファイル名パラメータを設定しても機能しません。しかし、興味があります。(android / javaからではなく)コマンドラインからユーティリティを呼び出すと、すべて機能しました。%20のスペースを置き換えると、とにかく機能しません。

1)ファイル名(元の):util dir \ some test.txt-機能しません(java、cmd)。正常です。

2)ファイル名(クアット):util "dir \ some test.txt"-cmdで機能し、javaでは機能しません。

3)ファイル名(エンコード):util "dir \ some%20test.txt"-機能しません(java、cmd)。

PS:ユーティリティはffmpegです

4

4 に答える 4

0

dir\\some test.txtまたはdir/some test.txtJavaで使用します。

注意: \はJavaの特殊文字(エスケープ)です。\例のようにリテラルとして使用する必要がある場合は、加算\文字をエスケープする必要があります。

于 2012-11-07T02:06:46.780 に答える
0

プログラムを開始すると、各スペースは新しい「arg」として登録されるため、スペースに分割すると、プログラムはより多くの引数があると見なし、ファイル名を希望どおりに読み取らないことを意味します。構文はそのように設計されているため、引用符はCMDでのみ機能します。エスケープキーが必要です。ダブルバックスラッシュ"\\"を試して、ここでllegal-escape-character-followed-by-a-spaceを見てください。

于 2012-11-07T02:24:44.577 に答える
0

util "dir\some test.txt"次のようにJavaで実行しようとしていると仮定します。

System.exec("util \"dir\\some test.txt\"");

またはそのようなもの。もしそうなら、問題は、execメソッドがコマンド文字列を引数に分割するという単純な方法にあります。引用符に関係なく、空白文字のシーケンスを引数の区切り文字として扱うだけです。したがって、上記は実際にutilコマンド引数"dir\sometest.txt"...を渡しているため、ファイルが見つかりません。

これに対処する最良の方法はexec、文字列の配列を渡す場所のオーバーロードを使用することです。例えば

System.exec(new String[]{"util", "dir\\some test.txt"});

記録のために:

  • util "dir\some test.txt"CMD言語は二重引用符を使用した引用符をサポートしているため、CMDで機能します。POSIXシェルでも同様のことができます。

  • util "dir\some%20test.txt"CMD言語はパーセントエスケープを理解しないため、失敗します。パーセントエスケープはURLで使用されます...そして問題のコマンドがURL引数を予期しない限り、%文字を通常のファイル名文字として扱います。

最後に、さまざまな種類の引用とエスケープを「ランダムに」試みることは、問題解決への良いアプローチではありません。あなたがそれを解決しようとする前に、あなたは本当に問題を理解しようとするべきです...

于 2012-11-07T02:39:57.317 に答える
0

私は特別な文字について知っています。ファイル名を手動で設定していません。私はいくつかのファイルを持っています、使用getAbsoluteFile()して、すべての円記号は大丈夫です。

私は次のようにプロセスを実行します:

    ProcessBuilder pbuilder = new ProcessBuilder(cmd);
    Process proc = pbuilder.start();

ここで、cmdは私のコマンドです:utilfilename

UPD:

次に、引数String[]を指定してProcessBuilderを使用します。働いた。

于 2012-11-07T03:01:23.740 に答える