为了进行备份,我将带有测试脚本的目录复制到另一个位置。为此,我正在使用Files.walkFileTree(fromDir,SimpleFileVisitor)。
这可以按预期工作,我可以多次复制它而没有任何问题。
但是,当我通过Windows File Explorer删除目标目录时,尝试进行备份时会在目标目录上收到java.nio.file.FileAlreadyExistsException。
我很确定目标目录不存在。
当我关闭Java程序并再次启动它时,它再次起作用。就像手动删除目录会锁定“不存在”的目标目录,而Java会抛出FileAlreadyExistsException。
这是SimpleFileVisitor的相关部分
我在复制文件时正在使用这些选项
StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES, LinkOption.NOFOLLOW_LINKS
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException
{
Path copyDir = toDir.resolve(fromDir.relativize(dir));
try {
Files.createDirectories(copyDir);
}
catch(IOException ioe) {
LOG.error("Failed to create directory " + copyDir.toString());
throw ioe;
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException
{
Path toFile = toDir.resolve(fromDir.relativize(file));
try {
Files.copy(file, toFile, opts);
}
catch(IOException ioe) {
LOG.error("Failed to create file " + toFile.toString());
throw ioe;
}
return FileVisitResult.CONTINUE;
}
我期望通过Windows File Explorer删除目标目录不会导致此问题,但是显然可以。
万一有人通过Windows File Explorer删除目录,我是否可以做些复制动作。