如何知道递归文件扫描的当前文件夹深度

时间:2014-09-30 18:57:16

标签: java recursion

我写了一个函数,递归扫描文件夹以搜索文件并处理它们(foundFile())。

问题是当函数找到别名文件夹时(例如在mac中,当我尝试在/Volumes文件夹中循环时)。脚本无限循环(我不知道为什么)。是否有可能知道递归的当前“深度”并停在(即)20?

甚至在特定情况下停止循环(别名文件夹)

private String[] types = { ".wav", ".mp3", ".ogg", ".wave", ".wma"};
public void listFile(String pathname) {
    File f = new File(pathname);
    File[] listfiles = f.listFiles();
    if(listfiles!=null){
        for (int i = 0; i < listfiles.length; i++) {
            if (listfiles[i].isDirectory()) {
                File[] internalFile = listfiles[i].listFiles();
                if(internalFile!=null){
                    for (int j = 0; j < internalFile.length; j++) {
                        for(int h=0;h<types.length;h++){
                            if(internalFile[j].getAbsolutePath().endsWith(types[h])){
                                found.put(types[h], found.get(types[h])+1);
                                foundFile(internalFile[j]);
                            }
                        }
                        if (internalFile[j].isDirectory()) {
                            String name = internalFile[j].getAbsolutePath();
                            listFile(name);
                        }
                    }
                }
            } else {
                processed+=1;
                for(int j=0;j<types.length;j++){
                    if(f.getAbsolutePath().endsWith(types[j])){
                        this.found.put(types[j], found.get(types[j])+1);
                        foundFile(listfiles[i]);
                    }
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

像这样,添加一个级别参数:

public void listFile(final String pathname, int level) {
    if (level == 20){
        return;
    }
    final File f = new File(pathname);
    final File[] listfiles = f.listFiles();
    if (listfiles != null) {
        for (int i = 0; i < listfiles.length; i++) {
            if (listfiles[i].isDirectory()) {
                final File[] internalFile = listfiles[i].listFiles();
                if (internalFile != null) {
                    for (int j = 0; j < internalFile.length; j++) {
                        for (int h = 0; h < types.length; h++) {
                            if (internalFile[j].getAbsolutePath().endsWith(types[h])) {
                                found.put(types[h], found.get(types[h]) + 1);
                                foundFile(internalFile[j]);
                            }
                        }
                        if (internalFile[j].isDirectory()) {
                            final String name = internalFile[j].getAbsolutePath();
                            listFile(name, level + 1);
                        }
                    }
                }
            } else {
                processed += 1;
                for (int j = 0; j < types.length; j++) {
                    if (f.getAbsolutePath().endsWith(types[j])) {
                        this.found.put(types[j], found.get(types[j]) + 1);
                        foundFile(listfiles[i]);
                    }
                }
            }
        }
    }
}