java 复制文件时出现DirectoryNotEmptyException

ovfsdjhp  于 2023-05-15  发布在  Java
关注(0)|答案(1)|浏览(366)

我写了一个程序,在那里你可以备份文件或目录到选定的文件夹。下面是我的一段代码:

try {
    if (srcFileOrDir.isFile()) {
        File destFile = new File(destDir.getAbsolutePath() + File.separator + srcFileOrDir.getName());
        Files.copy(srcFileOrDir.toPath(), destFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
    }
    else { //isDirectory
        String[] pathParts = srcFileOrDir.getAbsolutePath().split("\\\\");
        destDir = new File(destDir.getAbsolutePath() + File.separator + pathParts[pathParts.length-1]);
        Files.walk(srcFileOrDir.toPath()).forEach(source -> {
            Path destination = destDir.toPath().resolve(srcFileOrDir.toPath().relativize(source));
            try {
                Files.copy(source, destination, StandardCopyOption.REPLACE_EXISTING);
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    }
    JOptionPane.showMessageDialog(null, "Backup was created successfully at " +       destDir.getAbsolutePath(), "Success!", JOptionPane.INFORMATION_MESSAGE);
}
catch (IOException e) {
    e.printStackTrace();
}

问题是,当我试图执行Files.copy()时,程序抛出DirecroryNotEmptyException。只有在尝试备份目录时才会引发异常。如果我正在备份文件,一切正常。
我使用了REPLACE_EXISTING选项,但我的程序忽略了它。先谢谢你了。

wlp8pajw

wlp8pajw1#

您的代码将只处理目录复制到新位置。请参见Files.copy的文档:
throws DirectoryNotEmptyException -指定了REPLACE_EXISTING选项,但无法替换文件,因为它是非空目录
因此,不需要复制已存在的目录,只需事先检查!isDirectory()作为复制行的前缀即可。

if (!Files.isDirectory(destination)) {
    System.out.format("Files.copy(%s, %s)%n",source, destination);
    Files.copy(source, destination, StandardCopyOption.REPLACE_EXISTING);
}

也没有必要测试srcFileOrDir.isFile(),因为Files.walk适用于文件或目录。将所有这些与异常处理结合在一起,没有路径分割,并清理新的Path only方法:

private static void copyToDirectory(Path src, Path destDir) throws IOException {
    final Path dest = destDir.resolve(src.getFileName());
    System.out.format("copying %s => %s%n",src, dest);
    Files.walk(src).forEach(source -> {
        Path destination = dest.resolve(src.relativize(source));
        try {
            if (!Files.isDirectory(destination)) {
                System.out.format("Files.copy(%s, %s)%n",source, destination);
                Files.copy(source, destination, StandardCopyOption.REPLACE_EXISTING);
            }
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    });
}

相关问题