Удалите все файлы и подкаталоги, но оставьте текущий каталог пустым в Java - PullRequest
0 голосов
/ 31 августа 2018

У меня есть папка "/ a / b /", и я хотел бы удалить все внутри папки b, включая файлы, каталоги и файлы и подкаталоги внутри этих каталогов, но я хочу сохранить папку b пустой без ее удаления , Я попробовал:

Files.walk(Paths.get("/a/b/"))//
                 .map(Path::toFile)//
                 .sorted(Comparator.comparing(File::isDirectory))//
                 .forEach(File::delete);

Это решение работало нормально, когда оно удаляло все внутри папки b, но оно также удаляло и папку b, которую я хотел бы сохранить. Как мне изменить здесь, чтобы сохранить папку б, кто-нибудь может дать мне совет? Спасибо

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Вы можете использовать FileUtils из apache commons-io:

FileUtils.cleanDirectory(Paths.get("/a/b/").toFile()); 

Документы: org.apache.commons.io.FileUtils.cleanDirectory

ОБНОВЛЕНО: Только для знаний, согласно документации для File.walks :

The returned stream encapsulates one or more {@link DirectoryStream}s.
 * If timely disposal of file system resources is required, the
 * {@code try}-with-resources construct should be used to ensure that the
 * stream's {@link Stream#close close} method is invoked after the stream
 * operations are completed.

Итак, если вы не используете, как это:

try(Stream<Path> paths = Files.walks(...)) {
  //Operations here with paths
}

Поток не закроется, даже с forEach.

0 голосов
/ 31 августа 2018

Фильтровать все, кроме этого каталога:

Path rootPath = Paths.get("/a/b/");
Files.walk(rootPath)//
     .filter(p -> !p.equals(rootPath))
     .map(Path::toFile)//
     .sorted(Comparator.comparing(File::isDirectory))//
     .forEach(File::delete);

Обратите внимание, что .sorted(Comparator.comparing(File::isDirectory)) может быть недостаточно.
Удаление каталогов в первой инстанции имеет значение, но их порядок удаления также имеет значение.

Предположим, у вас есть каталоги: /a/b/, /a/b/c, /a/b/c/d.
Вы хотите удалить каталог глубиной-последней перед глубиной-первой, то есть /a/b/c/d до /a/b/c.
Но File.walk() идет вглубь. Таким образом, он будет повторяться в следующем порядке: /a/b/, /a/b/c, /a/b/c/d.
Так что измените естественный порядок потока File:

 .sorted(Comparator.reverseOrder())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...