gpt4 book ai didi

java - 在 java 中移动目录会抛出 java.nio.file.FileAlreadyExistsException

转载 作者:可可西里 更新时间:2023-11-01 09:36:18 30 4
gpt4 key购买 nike

我正在创建一个回滚功能,这是我想要实现的:

  1. 在与 data 文件夹 相同的位置创建一个 tmp 文件夹

  2. 在执行任何操作之前,我将所有内容从data 文件夹 复制到tmp 文件夹(少量数据)。

  3. 回滚时我想删除数据文件夹并将重命名tmp文件夹数据文件夹 .

这是我试过的

String contentPath = "c:\\temp\\data";
String tmpContentPath = "c:\\temp\\data.TMP";
if (Files.exists(Paths.get(tmpContentPath)) && Files.list(Paths.get(tmpContentPath)).count() > 0) {
FileUtils.deleteDirectory(new File(contentPath));
Files.move(Paths.get(tmpContentPath), Paths.get(contentPath), java.nio.file.StandardCopyOption.REPLACE_EXISTING);
}

但这会抛出 FileAlreadyExistsException,即使我用相同的方法删除了目标目录。

一旦程序退出,我就看不到 c:\temp\data 目录,所以该目录实际上被删除了。

现在,如果我尝试 StandardCopyOption.ATOMIC_MOVE,它会抛出 java.nio.file.AccessDeniedException。

在这种情况下,将 tmp 目录 移动到 data 目录 的最佳方法是什么?

最佳答案

实际上在 java 7 或更高版本中你可以只使用 Files实现文件夹移动即使有冲突,这意味着目标文件夹已经存在。

private static void moveFolder(Path thePath, Path targetPath) {
if (Files.exists(targetPath)) { // if the target folder exists, delete it first;
deleteFolder(targetPath);
}
try {
Files.move(thePath, targetPath);
} catch (IOException ignored) {
ignored.printStackTrace();
}
}

private static void deleteFolder(Path path) {
try {
if (Files.isRegularFile(path)) { // delete regular file directly;
Files.delete(path);
return;
}
try (Stream<Path> paths = Files.walk(path)) {
paths.filter(p -> p.compareTo(path) != 0).forEach(p -> deleteFolder(p)); // delete all the children folders or files;
Files.delete(path); // delete the folder itself;
}
} catch (IOException ignored) {
ignored.printStackTrace();
}
}

关于java - 在 java 中移动目录会抛出 java.nio.file.FileAlreadyExistsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51433695/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com