6

Javaから、File.createTempFile()を使用して指定された場所に実行可能ファイルを抽出しています。実行可能ファイルを実行しようとすると、出力の最初の行を読み取ろうとするとプログラムがハングします。

別のプログラムから同じ抽出実行可能ファイルを実行しようとすると、ディレクトリをC:\ Documents and Settings \ username \ Local Settings \ Temp\prog.exeとして指定すると機能することがわかりました。しかし、ディレクトリをC:\ DOCUME〜1 \ USERNA〜1 \ LOCALS〜1 \ Temp \ prog.exeと指定すると、ハングします。

プログラムでチルダファイル名を解除して、機能するディレクトリ名を指定できるようにする方法はありますか?

(そして、私は常に言語とAPIの設計の問題に対処するのが好きなので、Java File.createTempFile()とjava.io.tmpdirが壊れたファイル名を評価しなければならない理由はありますか?)

4

2 に答える 2

10

を使用getCanonicalPath()して、展開されたパスを取得できます。例えば:

try
{
  File file = File.createTempFile("abc", null);
  System.out.println(file.getPath());
  System.out.println(file.getCanonicalPath());
}
catch (IOException e) {}

...生成します...

C:\DOCUME~1\USERNA~1\LOCALS~1\Temp\abc49634.tmp
C:\Documents and Settings\username\Local Settings\Temp\abc49634.tmp

これをXPでテストしましたが、他のWindowsオペレーティングシステムでも同様に機能すると想定しています。

2番目の質問に対する@raviawの回答を参照してください。

于 2010-03-25T19:02:26.807 に答える
3

うわー、私はそれを見たことがない。実際のところ、環境変数%TEMP%はマングルされた名前を返します(これは私のコンピューターからのものです)。

TEMP = C:\ DOCUME〜1 \ raviw \ LOCALS〜1 \ Temp
TMP = C:\ DOCUME〜1 \ raviw \ LOCALS〜1 \ Temp

新しく作成されたJavaVMが環境変数を使用して一時フォルダーの場所を取得すると仮定すると、ディレクトリが破損するのはVMの責任ではありません。

また、System.getenv()を使用して一時フォルダーを取得しようとしても、同じ問題が発生します。

私はそれを確認します:

  • この問題は、「prog.exe」というディレクトリがあるという事実が原因ではありません(あなたの質問に基づいて、私はこれを想定しています)。
  • ファイルが「prog.exe」の場合、他のプログラム(アンチウイルスなど)で使用されていなかった場合。
  • コンピューターが正常かどうかを確認します(これは、Webアプリケーションではなく、一時ファイルを必要とするアプリケーションにとって非常に重大なバグです)。
于 2010-03-25T19:05:30.333 に答える