Фильтровать все, кроме этого каталога:
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())