32

WinXPを使用しています。java を使用してファイルのリストを生成します。ファイルは最初 abc.txt.temp として作成され、生成が完了すると abc.txt に名前が変更されます。

ただし、ファイルを生成するときに、一部のファイルの名前を変更できませんでした。ランダムに発生します。

失敗した理由を見つける方法はありますか?

int maxRetries = 60;
logger.debug("retry");
while (maxRetries-- > 0)
{
    if (isSuccess = file.renameTo(file2))
    {
        break;
    }
    try
    {
        logger.debug("retry " + maxRetries);
        Thread.sleep(1000);
    }
    catch (InterruptedException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }   
}

//file.renameTo(file2);
Thread.currentThread().getThreadGroup().getParent().list();

そして結果:

[DEBUG][2009-08-25 08:57:52,386] - retry 1
[DEBUG][2009-08-25 08:57:53,386] - retry 0
java.lang.ThreadGroup[name=system,maxpri=10]
    Thread[Reference Handler,10,system]
    Thread[Finalizer,8,system]
    Thread[Signal Dispatcher,9,system]
    Thread[Attach Listener,5,system]
    java.lang.ThreadGroup[name=main,maxpri=10]
        Thread[main,5,main]
        Thread[log4j mail appender,5,main]
[DEBUG][2009-08-25 08:57:54,386] - isSuccess:false

その理由を解明するための体系的なアプローチを知りたいです。ありがとう。

4

8 に答える 8

32

名前の変更が失敗した理由は、ファイルがまだ開いている可能性があります。ファイルを閉じている場合でも、(たとえば) の理由で開いたままになる可能性があります。

  1. ファイル ハンドルは、プロセスのサブプロセスによって継承されます
  2. ウイルス対策プログラムがファイルのウイルスをスキャンしているため、ファイルが開かれています
  3. インデクサー (Google デスクトップや Windows インデックス サービスなど) がファイルを開いている

ファイルを開いたままにしている原因を特定するには、 FileMonHandleなどのツールを使用します。

更新: Unlocker などのツールは、ファイルが非常に短時間しか開いていない場合 (ウイルス対策スキャンの場合など) には役に立たない場合があります。ただし、javaw.exe がファイルを開いていると表示される場合は、それが問題です。

于 2009-08-25T00:20:22.773 に答える
3

例外がスローされなかった場合(気付いたと思いますが)renameTo()、名前の変更が成功したかどうかを示すためにtrueまたはfalseを返すだけで、追加情報は提供されません。

Windowsであるため、障害はファイルが現在使用中であることを示している可能性があります。これは、他のプロセスが開いているために発生します。ただし、プロセスの書き込みが完了していないか、書き込みが完了した後でファイルを閉じるのを忘れた可能性があります。

無効なパスを渡したか、Fileコンストラクターに存在しないパスを指定した可能性もあります。

renameTo()セキュリティ違反()がある場合、またはファイルの名前を変更するためにSecurityExceptionを渡した場合にのみ、例外がスローされます。null

于 2009-08-25T00:19:15.287 に答える
3
File o=new File("d:/old.txt");
File n=new File("d:/new.txt");
n.delete();
o.renameTo(n);

n.delete() : ファイル (new.txt) が存在する場合は削除する必要があります。

o.rename(n): ファイル (old.txt) の名前が new.txt に変更されるように

于 2012-10-11T19:02:08.377 に答える
2

同様の問題がありましたが、これはunixにあります。
名前の変更はランダムに失敗しました。プロセスを 3 ~ 4 回やり直して、ようやく成功しました。
参考までに、ファイルは同じプロセスによって作成され、同じプロセスによって名前が変更されます..

于 2012-01-03T06:49:37.427 に答える
0

Macでも同じことが見られます。1 つのスレッドで 163,000 個のファイルを作成するプロセスがあります。既に存在するファイルの作成をスキップします。部分的なファイルの問題を回避するために、ファイルを書き込むときに、一時ファイル (.../dir/tmp.filename) を書き込み、名前を変更します (.../dir/filename)。

(IntelliJ 内から) 1 回実行すると、実行ウィンドウが消えました。これは奇妙でした。IntelliJ を再起動して再度実行したところ、ファイルの名前変更の束 (すべてではない) でエラーが発生し始めました。IntelliJ (起動していた) が終了したにもかかわらず、以前に実行していた Java プロセスがまだ実行されていることが判明しました。そのため、同じファイルの存在を探し、お互いのつま先を踏む 2 つのプロセスがありました。

于 2021-03-02T18:16:20.123 に答える
-4

ファイル f=新しいファイル(フォルダ+ファイル); 正しいパスを書いているかどうかを確認してください.. f.exists(); そうでなければ存在し、見られた場合はprocMonで検証を返します..

于 2012-01-07T18:44:41.377 に答える