web-dev-qa-db-ja.com

Files.moveとFiles.copyがJava.nio.file.FileAlreadyExistsExceptionをスローしています

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;
        }
    }
_

これが私が受け取っている例外です enter image description here on Files.move(tempPath, tempPath.resolveSibling(origFileName), StandardCopyOption.REPLACE_EXISTING);

また、このファイルをWindowsエクスプローラーで表示すると、サムネイルは表示されますが開くことができません。なぜ発生しているのか理解できません。REPLACE_EXISTINGを使用している場合、FileAlreadyExistsException例外がスローされるのはなぜですか。

また、前の質問は明確に述べられていないので編集しました。

助けてください。

アヌジ

8
aga

_Files.move_または_Files.copy_の実行中に、同じファイルリソースを保持している別のスレッドがあるかどうかを確認してください。同じ例外とファイルアクセスの症状があり、ファイルアクセスをシリアル化した後に解決できました。

また、_REPLACE_EXISTING_または_Files.copy_を実行するときに_Files.move_オプションを使用すると、元のファイルを削除してからtmpの名前を変更するという複数の手順をコーディングする必要がなくなりますが、_Files.move_または_Files.copy_はアトミックであることが保証されていません。 _ATOMIC_MOVE_オプションがありますが、javadocで説明されているようにファイルがすでに存在する場合に、IOExceptionがスローされる可能性がある実装固有の保証は好きではありません。

ATOMIC_MOVE:移動はアトミックファイルシステム操作として実行され、他のすべてのオプションは無視されます。ターゲットファイルが存在する場合、既存のファイルが置き換えられるか、IOExceptionをスローしてこのメ​​ソッドが失敗するかは、実装固有です。移動をアトミックファイルシステム操作として実行できない場合、AtomicMoveNotSupportedExceptionがスローされます。これは、たとえば、ターゲットの場所が別のFileStoreにあり、ファイルをコピーする必要がある場合、またはターゲットの場所がこのオブジェクトの別のプロバイダーに関連付けられている場合に発生する可能性があります。

9
dancnfoo