11

我想删除一个文件并用旧文件重命名另一个文件,但我无法移动这个文件,因为 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;
        }
    }

这是我收到的例外在此处输入图像描述 情况Files.move(tempPath, tempPath.resolveSibling(origFileName), StandardCopyOption.REPLACE_EXISTING);

此外,当我在 Windows 资源管理器中看到此文件时,它的缩略图存在但无法打开它。我无法理解它为什么会发生,如果我使用 REPLACE_EXISTING,为什么它会抛出 FileAlreadyExistsException 异常。

我还编辑了上一个问题,因为它没有明确说明。

请帮忙。

阿努伊

4

1 回答 1

14

检查您在运行时是否有另一个线程持有相同的文件资源Files.moveFiles.copy. 我有相同的异常和文件访问症状,并且能够在序列化文件访问后解决它。

此外,通过在执行orREPLACE_EXISTING时使用选项,您不再需要编写删除原始文件然后重命名 tmp 的多个步骤,尽管or不能保证是原子的。有一个选项,但是我不喜欢实现特定的保证,如果文件已经存在,如 javadoc 所描述的那样。Files.copyFiles.moveFiles.moveFiles.copyATOMIC_MOVEIOException

ATOMIC_MOVE :移动作为原子文件系统操作执行,所有其他选项都被忽略。如果目标文件存在,那么如果现有文件被替换或此方法因抛出 IOException 而失败,则它是特定于实现的。如果移动不能作为原子文件系统操作执行,则抛出 AtomicMoveNotSupportedException。例如,当目标位置位于不同的 FileStore 上并且需要复制文件时,或者目标位置与该对象的不同提供程序相关联时,就会出现这种情况。

于 2017-04-27T23:32:57.757 回答