web-dev-qa-db-ja.com

renameTo()が失敗した理由を見つける方法は?

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

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

29
janetsmith

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

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

ファイルを開いたままにしているものを見つけるには、 FileMonHandle などのツールを使用します。

更新:ファイルが非常に短い時間だけ開いたままになっている場合(アンチロックの場合など) -ウイルススキャン)。ただし、javaw.exeがファイルを開いていると表示されている場合は、それが問題です。

29
Vinay Sajip
_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に変更されるように

3
Sathish

RenameToが失敗する可能性のある3つの主な理由(Androidの場合、これも役立つかもしれません)!

1)場所aから場所bにフォルダーを移動する場合、宛先フォルダーはファイルである可能性があります! destinationFolder.mkdirs()を作成してファイルにします!

2)宛先フォルダーが既に存在する可能性があります! destinationFolderを削除して、renameToを使用して古いファイルをその新しい場所に移動できるようにします

3)内部ストレージを外部ストレージに移動するには、SDカードの読み取りと書き込みに許可が必要なため、許可が必要です。

3
coolcool1994

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

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

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

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

2
Dave Ray

私は同様の問題を抱えていましたが、これはUnixにあります。
名前の変更はランダムに失敗しました。プロセスを3〜4回再起動し、最終的に成功しました。
FYIファイルは同じプロセスによって作成され、同じプロセスによって名前が変更されます。

1
prashanth

また、十分な権限がないためにファイルの名前を変更しないこともできます。 Unixでは、これは簡単です。 Win10では、...を参照してください。 https://www.sevenforums.com/tutorials/1911-take-ownership-shortcut.html

0
Per Lindberg