1

我知道递归的基础知识,但在给定的代码中,我很难理解流程。
请帮帮我...

public ArrayList<String> searchFolders(File fo) {

    if (fo.isDirectory()) {

        String internalNames[] = fo.list();



        for (int i = 0; i < internalNames.length; i++) {
            searchFolders(new File(fo.getAbsolutePath() + "\\"+ internalNames[i]));
            path = fo.getAbsolutePath() + "\\" + internalNames[i];
        }
    }
    if (fo.isFile()) {

        alist.add(fo.toString());


    }


    return alist;
}
4

3 回答 3

2

基本上,这段代码获取目录的所有内容并将它们添加到全局变量alist中。

你给它一个目录。如果它是一个文件,那么它将其名称添加到列表中并且该方法返回(文件不能有子文件夹)。

如果它是一个文件夹,那么它会列出文件夹中的所有内容:

String internalNames[] = fo.list();

然后对文件夹中的每个项目执行相同的搜索:

searchFolders(new File(fo.getAbsolutePath() + "\\"+ internalNames[i]));

因此,如果您当前正在搜索的项目是一个文件(如果fo.getAbsolutePath() + "\\"+ internalNames[i]是一个文件的目录),那么它只是将该文件添加到全局 ArrayList。

否则,如果它是一个文件夹,它就像搜索它刚刚查看的文件夹一样搜索它,并列出该文件夹中的所有文件。

您似乎没有使用变量path

当您返回时alist,您将返回迄今为止在文件夹(及其子文件夹)中找到的所有文件。您没有返回文件夹名称,因为什么时候fo.isDirectory(),您没有将其名称添加到alist.

在此处输入图像描述

于 2012-06-20T09:13:22.070 回答
1

将此递归代码视为树浏览器。searchFolders 方法将扫描当前目录中存在的每个文件/文件夹并列出它,因此您可以说它从根节点获取所有子节点。

获得列表后,它将在根节点的每个子节点中调用自己(再次搜索文件夹和文件),并更新路径以了解它在哪里搜索。

当它找到所有没有要探索的文件夹而只有文件的子节点(甚至下降到 n 级)时,它将停止。

于 2012-06-20T09:12:39.013 回答
0

简而言之,考虑递归退出:

if (fo.isFile()) {

    alist.add(fo.toString());


}

fo是文件时,添加文件路径alist并退出;如果这个递归退出条件不成立,fo是一个目录,然后递归直到递归退出---'fo'是一个文件。

所以这个searchFolders方法查找文件夹和子文件夹中的每个文件,将它们的名称作为列表返回!

于 2012-06-20T09:43:22.810 回答