我知道递归的基础知识,但在给定的代码中,我很难理解流程 请帮帮我们......
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;
}
答案 0 :(得分:2)
基本上,此代码获取目录的所有内容并将其添加到全局变量alist
。
你给它一个目录。 如果它是一个文件,那么它将其名称添加到列表中并返回该方法(文件不能包含子文件夹)。
如果是文件夹,则会列出文件夹中的所有内容:
String internalNames[] = fo.list();
然后对文件夹中的每个项目执行相同的搜索:
searchFolders(new File(fo.getAbsolutePath() + "\\"+ internalNames[i]));
因此,如果您当前搜索的项目是文件(如果fo.getAbsolutePath() + "\\"+ internalNames[i]
是文件的目录),那么它只是将文件添加到全局ArrayList。
否则,如果它是一个文件夹,它会搜索它,就像刚搜索到它刚看到的文件夹一样,并列出文件夹中的所有文件。
您似乎没有使用变量path
。
当您返回alist
时,您将返回到目前为止在文件夹(及其子文件夹)中找到的所有文件。
您没有返回文件夹名称,因为在fo.isDirectory()
时,您没有将其名称添加到alist
。
答案 1 :(得分:1)
将此递归代码视为树资源管理器。 searchFolders方法将扫描当前目录中存在的每个文件/文件夹并列出它,因此您可以说它将从根节点获取所有子项。
获得列表后,它会在根节点的每个子节点中调用自己(再次搜索文件夹和文件),并更新路径以了解它在哪里搜索。
当它找到没有要浏览的文件夹的所有子节点(甚至下降到n级)时它将停止,但只有文件。
答案 2 :(得分:0)
简而言之,请考虑递归退出:
if (fo.isFile()) {
alist.add(fo.toString());
}
当fo
是文件时,将文件路径添加到alist
并退出;
如果这个递归退出条件不成立,fo
是一个目录,然后重复递归,直到递归退出---'fo'是一个文件。
所以这个searchFolders
方法找到文件夹和子文件夹中的每个文件,将它们的名称作为列表返回!