Java SimpleFileVisitor Проблема при обнаружении ошибок разрешения
Я пытаюсь найти на своем жестком диске файлы mp4 и скопировать их в определенную папку. Проблема в том, что у меня нет прав доступа к таким папкам, как: "C:\Documents and Settings"
, поэтому моя программа останавливается, когда сталкивается с ними, а не продолжает.
Я пытался создать черный список, но он не работает вообще.
package S;
import java.io.File;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
public class C {
public static void main(String args[]) throws IOException {
Path dir = Paths.get("C:/");
Files.walkFileTree(dir, new FindJavaVisitor());
}
private static class FindJavaVisitor extends SimpleFileVisitor<Path> {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
if (file.toString().contains(".mp4")) {
file.toFile().renameTo(new File("C:/MP4/"+file.toFile().getName()));
}
return FileVisitResult.CONTINUE;
}
}
}
1 ответ
Вы должны переопределить два метода.
Во-первых, это visitFileFailed()
метод.
Как указано в документации:
Если не переопределено, этот метод повторно генерирует исключение ввода-вывода, которое препятствовало посещению файла.
Вы также должны переопределить postVisitDirectory()
метод; у него есть два аргумента, второй является IOException
, Если есть ошибка, второй аргумент не будет нулевым, и в этом случае снова из документации:
Если не переопределено, этот метод возвращает CONTINUE, если итерация каталога завершается без исключения ввода-вывода; в противном случае этот метод повторно генерирует исключение ввода-вывода, которое привело к преждевременному завершению итерации каталога.
Учитывая вашу ошибку, вторая - та, которую вы хотите переопределить.
Тем не менее, я вижу в вашем коде, что вы делаете file.toFile().renameTo()
,
Не используйте это. использование Files.move()
вместо.
Наконец, вы также двигаетесь во время итерации... это не очень хорошая идея. Напомним, что список файлов в каталоге, например, и в отличие от старого API, заполняется динамически!
Вы должны создать "переименование" Map<Path, Path>
и выполните переименования после того, как вы посетили все это. По крайней мере, так я бы поступил в этом случае.