Пытаюсь получить массив всех подпапок на сервере с использованием 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;
    }

}
→ Ссылка