В целях создания резервной копии я копирую каталог со сценариями тестирования в другое место. Для этого я использую Files.walkFileTree (отDir, SimpleFileVisitor).
Это работает, как и ожидалось, и я могу скопировать его несколько раз без каких-либо проблем.
Но когда я удаляю целевой каталог через проводник Windows, я получаю исключение 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 не вызовет этой проблемы, но, очевидно, это так.
Могу ли я что-нибудь сделать, чтобы сделать возможным действие копирования в случае, если кто-то удалит каталог через проводник Windows.