1つのファイルを削除し、別のファイルの名前を古いファイルに変更したいのですが、Javaが_Java.nio.file.FileAlreadyExistsException
_をスローしているため、このファイルを移動できません。以下は、使用しているコードスニペットです。
_static void swapData(String origFilePath, String tempFilePath) throws IOException{
Path tempPath = FileSystems.getDefault().getPath(tempFilePath);
Path origPath = FileSystems.getDefault().getPath(origFilePath);
try{
String origFileName = null;
File origFileRef = new File(origFilePath);
if(Files.exists(origPath)){
origFileName = origFileRef.getName();
Files.delete(origPath);
if(Files.exists(origPath))
throw new IOException("cannot able to delete original file");
}
if(origFileName != null)
Files.move(tempPath, tempPath.resolveSibling(origFileName), StandardCopyOption.REPLACE_EXISTING);
}catch(IOException e){
throw e;
}
}
_
これが私が受け取っている例外です on Files.move(tempPath, tempPath.resolveSibling(origFileName), StandardCopyOption.REPLACE_EXISTING);
また、このファイルをWindowsエクスプローラーで表示すると、サムネイルは表示されますが開くことができません。なぜ発生しているのか理解できません。REPLACE_EXISTINGを使用している場合、FileAlreadyExistsException例外がスローされるのはなぜですか。
また、前の質問は明確に述べられていないので編集しました。
助けてください。
アヌジ
_Files.move
_または_Files.copy
_の実行中に、同じファイルリソースを保持している別のスレッドがあるかどうかを確認してください。同じ例外とファイルアクセスの症状があり、ファイルアクセスをシリアル化した後に解決できました。
また、_REPLACE_EXISTING
_または_Files.copy
_を実行するときに_Files.move
_オプションを使用すると、元のファイルを削除してからtmpの名前を変更するという複数の手順をコーディングする必要がなくなりますが、_Files.move
_または_Files.copy
_はアトミックであることが保証されていません。 _ATOMIC_MOVE
_オプションがありますが、javadocで説明されているようにファイルがすでに存在する場合に、IOException
がスローされる可能性がある実装固有の保証は好きではありません。
ATOMIC_MOVE:移動はアトミックファイルシステム操作として実行され、他のすべてのオプションは無視されます。ターゲットファイルが存在する場合、既存のファイルが置き換えられるか、IOExceptionをスローしてこのメソッドが失敗するかは、実装固有です。移動をアトミックファイルシステム操作として実行できない場合、AtomicMoveNotSupportedExceptionがスローされます。これは、たとえば、ターゲットの場所が別のFileStoreにあり、ファイルをコピーする必要がある場合、またはターゲットの場所がこのオブジェクトの別のプロバイダーに関連付けられている場合に発生する可能性があります。