Пытаюсь получить массив всех подпапок на сервере с использованием SMBJ библиотеки. Проблема с выводом массива
Пытаюсь получить массив из дерева всех папок на сервере. Проблема в том что я не могу вернуть целый массив из-за рекурсивного вызова метода serverFoldersList в цикле for, как я понял при каждом новом цикле массив обнуляется, как можно получить весь список и вернуть массив основному классу на примере вывода из System.out.println(arr)? Буду рад любым идеям. Спасибо.
class ServerFFL { // Get recursive all server Folders
List<String> serverFoldersList (DiskShare share, String path) {
List<String> subDirectories = new ArrayList<>();
String arr = null;
List<FileIdBothDirectoryInformation> subs = share.list(path);
for (FileIdBothDirectoryInformation sub : subs) {
String filename = sub.getFileName();
if (".".equals(filename) || "..".equals(filename)) {
continue;
}
if (EnumWithValue.EnumUtils.isSet(sub.getFileAttributes(), FileAttributes.FILE_ATTRIBUTE_DIRECTORY)) {
arr = path + "/" + filename;
serverFoldersList(share, arr);
}
System.out.println(arr);
subDirectories.add(arr);
}
return subDirectories;
}
Вывод: return
[ServerTest//Folder1, ServerTest//Folder2]
Вывод: System.out.println(arr);
I/System.out: ServerTest//Folder1 I/System.out: ServerTest//Folder2/sub_folder1/sub_folder2 I/System.out: ServerTest//Folder2/sub_folder1 I/System.out: ServerTest//Folder2
Ответы (1 шт):
Рекурсивный вызов в этом случае надо делать не так. Ваш ArrayList создается непосредственно в теле рекурсивного метода. Каждый раз при вызове этого метода вы обращаетесь с новым экземпляром ArrayList. А вы хотите в этом листе накопить информацию о всех папках , включая вложенные, преобразовав древовидную структуру папок в массив (в ArrayList). поэтому сделайте ваш метод приватным и вызывайте его из публичного метода, передавая в аргументы уже созданную в публичном методе коллекцию. ее же передавайте при рекурсивном вызове. таким образом, коллекция будет одна, независимо от количества и глубины рекурсивных методов. протестировать я не могу, это уже на вашей совести, как и отладка.
import java.util.ArrayList;
import java.util.List;
class ServerFFL { // Get recursive all server Folders
public List<String> serverFoldersList(DiskShare share, String path) {
List<String> subDirectories = new ArrayList<>();
return serverFoldersList(share, path, subDirectories);
}
private List<String> serverFoldersList(DiskShare share, String path, List<String> subDirectories) {
String arr = null;
List<FileIdBothDirectoryInformation> subs = share.list(path);
for (FileIdBothDirectoryInformation sub : subs) {
String filename = sub.getFileName();
if (".".equals(filename) || "..".equals(filename)) continue;
if (EnumWithValue.EnumUtils.isSet(sub.getFileAttributes(), FileAttributes.FILE_ATTRIBUTE_DIRECTORY)) {
arr = path + "/" + filename;
serverFoldersList(share, arr, subDirectories);
}
System.out.println(arr);
subDirectories.add(arr);
}
return subDirectories;
}
}