посещение первого уровня каталога и получение размера каждого каталога Java - PullRequest
3 голосов
/ 24 апреля 2019

Мне нужен список каталогов в C: и получить размер для каждого. Я пытаюсь с этим кодом:

int[] count = {0};
try {
    Files.walkFileTree(Paths.get(dir.getPath()), new HashSet<FileVisitOption>(Arrays.asList(FileVisitOption.FOLLOW_LINKS)),
            Integer.MAX_VALUE, new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult visitFile(Path file , BasicFileAttributes attrs) throws IOException {
                    System.out.printf("Visiting file %s\n", file);
                    ++count[0];

                    return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult visitFileFailed(Path file , IOException e) throws IOException {
                    System.err.printf("Visiting failed for %s\n", file);

                    return FileVisitResult.SKIP_SUBTREE;
                }

                @Override
                public FileVisitResult preVisitDirectory(Path dir , BasicFileAttributes attrs) throws IOException {
                     System.out.printf("About to visit directory %s\n", dir);
                    return FileVisitResult.CONTINUE;
                }
            });
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} 

У меня проблема в том, что если я использую именно это, отнимает много времени, потому что он посещает каждый файл! диска. Я пытался с различными вариантами для FileVisitResult, но я не могу получить желаемый результат. Мне нужен только первый уровень с пространством на диске. Заранее спасибо за любую помощь.

1 Ответ

4 голосов
/ 24 апреля 2019

Папки не имеют собственного (значительного) размера.Обычно, когда обсуждается размер папки, значение равно сумма размеров всех файлов в этой папке и ее подпапках .Эта операция занимает «очень много» времени для C: \ (попробуйте щелкнуть правой кнопкой мыши папку «Program Files» и выбрать свойства).Удалите все журналы и попробуйте снова.Сравните время, необходимое вашему коду, со временем, которое требуется Windows Explorer для вычисления этого размера (опять же, щелкнув правой кнопкой мыши папку «Program Files» и выбрав свойства).

В любом случае Apache commons-io имеетоднострочный:

long size = FileUtils.sizeOfDirectory(folder);

А у Java-8 есть еще один «чистый» однострочный:

long size = Files.walk(Paths.get("C:\\"))
      .filter(p -> p.toFile().isFile())
      .mapToLong(p -> p.toFile().length())
      .sum();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...