Как найти дерево папок\файлов из внутренней папки
Делаю код для постройки дерево из папок и файлов. Изначально мой код получает что-то, и если там пусто if (!file.exists()) возвращает пустой String, если есть файл возвращает название файла.
public Optional<String> tree(Path path) {
File file = new File(String.valueOf(path));
if (!file.exists()) {
return Optional.empty();
} else if (file.isFile()) {
return Optional.of(file.getName());
} else if (file.isDirectory()) {
...
}
return null;
}
Трудности начинаются когда есть папка. В этом случае я должен посмотреть всё что в ней есть и в случае если есть папка посмотреть что в ней и так далее. Пытался сделать при помощи if-else конструкции, но эта конструкция работает только до того уровня который задан в if-else, а надо чтоб не было рамок, и программа выдавала результат всей цыпочки.
else if (file.isDirectory()) {
System.out.println(file.getName());
File[] filesArray = file.listFiles();
for (File filer : filesArray) {
if (filer.isFile()) {
System.out.println(filer.getName());
} else if (filer.isDirectory()) {
System.out.println(filer.getName());
File[] filesArrays = filer.listFiles();
for (File filers : filesArrays) {
if (filers.isFile()) {
System.out.println(filers.getName());
}
}
} else {
System.out.println(filer.getName());
}
При такой конструкции получил результат, но а если в папе inner1 есть например папка inner 1.1 с файлами, тот же самый результат будет:
test1
inner1
some.txt
some1.txt
some.txt
some1.txt
some2.txt
Ответы (1 шт):
Попробуйте использовать рекурсию для данной задачи:
void printRecursiveTree(Path path) {
File file = new File(String.valueOf(path));
if (file.isFile()) {
System.out.println(file.getName());
} else if (file.isDirectory()) {
File[] filesArray = file.listFiles();
for (File filer : filesArray) {
printRecursiveTree(filer.toPath());
}
}
}
Небольшой бонус - вы можете сделать дерево файлов более реалистичным, применив отступы:
void printRecursiveTree(Path path, int level) {
File file = new File(String.valueOf(path));
if (file.isFile()) {
System.out.println(" ".repeat(level) + file.getName());
} else if (file.isDirectory()) {
File[] filesArray = file.listFiles();
for (File nestedFile : filesArray) {
printRecursiveTree(nestedFile.toPath(), level + 1);
}
}
}
Вызов функции:
printRecursiveTree(Path.of("C:/Users/oQaris/Desktop/Git"), 0);