我写了一个程序,在那里你可以备份文件或目录到选定的文件夹。下面是我的一段代码:
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选项,但我的程序忽略了它。先谢谢你了。
1条答案
按热度按时间wlp8pajw1#
您的代码将只处理目录复制到新位置。请参见Files.copy的文档:
throws DirectoryNotEmptyException -指定了REPLACE_EXISTING选项,但无法替换文件,因为它是非空目录
因此,不需要复制已存在的目录,只需事先检查
!isDirectory()
作为复制行的前缀即可。也没有必要测试
srcFileOrDir.isFile()
,因为Files.walk
适用于文件或目录。将所有这些与异常处理结合在一起,没有路径分割,并清理新的Path
only方法: