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> и выполните переименования после того, как вы посетили все это. По крайней мере, так я бы поступил в этом случае.

Другие вопросы по тегам