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
理由を解明するための体系的なアプローチを知りたい。ありがとう。
名前の変更が失敗した理由は、ファイルがまだ開いていることである可能性があります。ファイルを閉じている場合でも、次の理由で開いたままになる可能性があります:
ファイルを開いたままにしているものを見つけるには、 FileMon や Handle などのツールを使用します。
更新:ファイルが非常に短い時間だけ開いたままになっている場合(アンチロックの場合など) -ウイルススキャン)。ただし、javaw.exeがファイルを開いていると表示されている場合は、それが問題です。
_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に変更されるように
RenameToが失敗する可能性のある3つの主な理由(Androidの場合、これも役立つかもしれません)!
1)場所aから場所bにフォルダーを移動する場合、宛先フォルダーはファイルである可能性があります! destinationFolder.mkdirs()を作成してファイルにします!
2)宛先フォルダーが既に存在する可能性があります! destinationFolderを削除して、renameToを使用して古いファイルをその新しい場所に移動できるようにします
3)内部ストレージを外部ストレージに移動するには、SDカードの読み取りと書き込みに許可が必要なため、許可が必要です。
例外がスローされなかった場合(お気づきだと思いますが)renameTo()
はtrueまたはfalseのみを返し、名前の変更が成功したかどうかを示し、追加情報を提供しません。
Windowsであるため、ほとんどの場合、障害はファイルが現在使用されていることを示しています。これは、他のプロセスが開いているために発生します。おそらく、プロセスが書き込みを終了していないか、書き込みが完了した後にファイルを閉じるのを忘れた可能性があります。
無効なパスを渡したり、File
コンストラクターに存在しないパスを指定した可能性もあります。
renameTo()
は、セキュリティ違反(SecurityException
)がある場合、またはファイルの名前を変更するためにnull
を渡す場合にのみ例外をスローします。
私は同様の問題を抱えていましたが、これはUnixにあります。
名前の変更はランダムに失敗しました。プロセスを3〜4回再起動し、最終的に成功しました。
FYIファイルは同じプロセスによって作成され、同じプロセスによって名前が変更されます。
また、十分な権限がないためにファイルの名前を変更しないこともできます。 Unixでは、これは簡単です。 Win10では、...を参照してください。 https://www.sevenforums.com/tutorials/1911-take-ownership-shortcut.html