1

最近、Linux環境とWindows環境の両方で、入力/出力ファイル名に空白を使用して、Javaからghostscriptコマンドを起動する必要があることに気付きました。コマンドの例は次のとおりです。

gs -q -dNOPAUSE -dBATCH -sDEVICE=pnggray -r300 -sOutputFile=/home/nic/tomcat/6.0.33 with spaces/temp/Thread-11/img-%03d.png /home/nic/tomcat/6.0.33 with spaces/temp/tmpfile.tmp

ghostscriptがパスにある場合、gsはウィンドウ上でgswin32に置き換えられます。

なんらかの方法でファイル名をエスケープする必要があることにすぐに気付きました。そのため、最初に行ったのは、ファイル名を二重引用符で囲むことでした。これはWindowsでは機能しましたが、Linuxでは機能しませんでした。Linuxでは、空白をバックスラッシュで囲んだりエスケープしたりする二重引用符を試しましたが、成功しませんでした。

私が使用しているコマンドを起動するためにRuntime.getRuntime().exec(command);、1つの文字列を渡します。ghostscriptに名前にスペースが含まれるファイル(「マイドキュメント」のようなもの)を取り込むようにするには、次の質問が見つかりました。

  • Linux用にも拡張したかったのです。
  • 二重引用符は、そこで指摘されている方法とは異なり、私にとってはうまくいくことがわかりました。

私はこのことを一度だけ理解したいと思います:あなたは私がこれをするのを手伝ってくれますか?

SOごとの私の試みの要約を以下に示します。

ウィンドウズ

ファイル名を二重引用符で囲むことは私のために働きました:

gswin32 -q -dNOPAUSE -dBATCH -sDEVICE=pnggray -r300 -sOutputFile="C:\Program Files\tomcat 6.0.33 with spaces\temp\Thread-11\img-%03d.png" "C:\Program Files\tomcat 6.0.33 with spaces\temp\tmpfile.tmp"

Linux

ファイル名を二重引用符で囲んでみました

gs -q -dNOPAUSE -dBATCH -sDEVICE=pnggray -r300 -sOutputFile="/home/nic/tomcat/6.0.33 with spaces/temp/Thread-11/img-%03d.png" "/home/nic/tomcat/6.0.33 with spaces/temp/tmpfile.tmp"

バックスラッシュで空白をエスケープしようとしました

gs -q -dNOPAUSE -dBATCH -sDEVICE=pnggray -r300 -sOutputFile=/home/nic/tomcat/6.0.33\ with\ spaces/temp/Thread-11/img-%03d.png /home/nic/tomcat/6.0.33\ with\ spaces/temp/tmpfile.tmp

両方を一緒に試しました

gs -q -dNOPAUSE -dBATCH -sDEVICE=pnggray -r300 -sOutputFile="/home/nic/tomcat/6.0.33\ with\ spaces/temp/Thread-11/img-%03d.png" "/home/nic/tomcat/6.0.33\ with\ spaces/temp/tmpfile.tmp"
4

1 に答える 1

4

複数の引数を取るRuntime.exec(String[] args)を使用しないのはなぜですか? このバリアントは、そのような引数をエスケープする必要がないように設計されています。引数は個別に提供されるため、空間ベースの補間は必要なく、混乱もありません。

于 2012-12-10T11:07:49.917 に答える