Предполагая, что я понимаю ваш вопрос, это мой ответ:
В вашем заданном коде:
File[] objects = folder.listFiles(new FilenameFilter() {
@Override
public boolean accept(File current, String name) {
return new File(current, name).isDirectory();
}
);
вы фильтруете все файлы, найденные в папке, и проверяете, является ли данный файл каталог с .isDirectory (). Таким образом, результирующий массив состоит только из папок.
Если вам нужны папки, а также файлы в результате, вы можете просто удалить фильтр, и у вас будут все файлы / папки в данной папке.
File[] objects = folder.listFiles();
Поскольку теперь код должен также обрабатывать файлы, мы должны немного изменить код, который обрабатывает отступы.
Перед изменением файлов и папок код действовал бы одинаково для каждого элемента в массиве объектов. Но теперь мы должны различать папку и файл.
Таким образом:
private static StringBuilder renderFolder(File folder, int level, StringBuilder sb, boolean isLast, List<Boolean> hierarchyTree) {
indent(sb, level, isLast, hierarchyTree).append(folder.getName()).append("\n");
File[] objects = folder.listFiles(new FilenameFilter() {
@Override
public boolean accept(File current, String name) {
return new File(current, name).isDirectory();
}
});
for (int i = 0; i < objects.length; i++) {
boolean last = ((i + 1) == objects.length);
// this means if the current folder will still need to print subfolders at this level, if yes, then we need to continue print |
hierarchyTree.add(i != objects.length - 1);
renderFolder(objects[i], level + 1, sb, last, hierarchyTree);
// pop the last value as we return from a lower level to a higher level
hierarchyTree.remove(hierarchyTree.size() - 1);
}
return sb;
}
Должно быть изменено, чтобы выглядеть примерно так:
private static StringBuilder renderFolder(File folder, int level, StringBuilder sb, boolean isLast, List<Boolean> hierarchyTree) {
indent(sb, level, isLast, hierarchyTree).append(folder.getName()).append("\n");
File[] objects = folder.listFiles();
for (int i = 0; i < objects.length; i++) {
boolean last = ((i + 1) == objects.length);
hierarchyTree.add(i != objects.length - 1);
if (objects[i].isDirectory() == false) {
indent(sb, level, isLast, hierarchyTree).append(objects[i].getName()).append("\n");
hierarchyTree.remove(hierarchyTree.size() - 1);
continue;
}
// this means if the current folder will still need to print subfolders at this level, if yes, then we need to continue print |
renderFolder(objects[i], level + 1, sb, last, hierarchyTree);
// pop the last value as we return from a lower level to a higher level
hierarchyTree.remove(hierarchyTree.size() - 1);
}
return sb;
}
Важное изменение состоит в том, что если объект в массиве не является folder вызывается функция indent, а затем l oop продолжается без вызова renderFolder для текущего файлового объекта.
if (objects[i].isDirectory() == false) {
indent(sb, level, isLast, hierarchyTree).append(objects[i].getName()).append("\n");
hierarchyTree.remove(hierarchyTree.size() - 1);
continue;
}
Тестирование в моей тестовой папке привело к следующему:
└──62476474
├──target
│ ├──generated-sources
│ │ └──annotations
│ ├──classes
│ │ ├──Main.class
│ └──maven-status
│ └──maven-compiler-plugin
│ └──compile
│ └──default-compile
│ └──inputFiles.lst
│ └──createdFiles.lst
└──pom.xml
└──src
├──test
│ └──java
└──main
└──java
└──Main.java
, что является точным представлением структуры моей папки.
Это должно решить вашу проблему .