列出特定深度的文件

时间:2016-02-15 08:23:07

标签: java file

我必须编写一个给出深度的程序,它必须列出该深度的所有现有文件和目录。到目前为止,这是代码:

static String path = "path";
static int depth = X;
static ArrayList<String> filesindepth = new ArrayList<String>();

public static ArrayList<String> Filescanner(File files[], int depth)
{
    if (depth > 0) {
        for (File file : files) 
        {
            if (file.isDirectory()) 
            {
                Filescanner(file.listFiles(), depth - 1);

            }
            if (depth==1) filesindepth.add(file.getAbsolutePath()); 
        }
    }
    return filesindepth;
}
public static void main(String[] args) {
    File[] file = new File(path).listFiles();
    Pfadscanner(file, depth);
    for (String files: filesindepth)
    {
        System.out.println(files);
    }
}

如果我使用深度1,代码工作正常,但是当使用更高的深度时,它只列出上一个文件夹中最后找到的目录中的文件,我想要该深度中所有目录和文件的列表(即使他们在不同的目录)。有人能告诉我我做错了什么吗?提前谢谢。

编辑:我们说我的结构如下:

    • Subdirectory1 /
      • Subdirectory1.1 /
      • Subdirectory1.2 /
    • Subdirectory2 /
      • Subdirectory2.1 /

程序应该显示Subdirectory1.1,Subdirectory1.2和Subdirectory2,1的绝对路径。

编辑由于@Ferrybig和@ m.yadav,问题解决了。最终的代码如上所示。

2 个答案:

答案 0 :(得分:1)

您忽略了递归调用

filesindepth.add(file.getAbsolutePath());
Filescanner(file.listFiles(), depth-1);

您忽略了对递归fileScanner的调用。

如果使用递归方法,则应确保在中心位置正确收集其他方法的结果。

在您的情况下,您可以通过将Collection.addAll称为:

来执行此操作
filesindepth.add(file.getAbsolutePath());
filesindepth.addAll(Filescanner(file.listFiles(), depth-1));

变量范围错误

static ArrayList<String> filesindepth;

为什么这个变量是静态的?它至少应限定为Filescanner方法,这样你就可以在它上面构建。

public static ArrayList<String> Filescanner(File files[], int depth)
{
    ArrayList<String> filesindepth = new ArrayList<String>();
    if (depth>0)
    {
        for (File file: files)
        {
            if(file.isDirectory())
            {
                filesindepth.add(file.getAbsolutePath());
                filesindepth.addAll(Pfadscanner(file.listFiles(), depth-1));
            }
        }
    }
    return filesindepth;    
}

您忽略了main方法

中的调用结果
       Filescanner(file, depth);
        for (String files : filesindepth) {
            System.out.println(files);
        }

你应该从方法中获取一个列表,然后从该调用处理方法,这是OOP的方法。

        ArrayList<String> filesindepth = Filescanner(file, depth);
        for (String files : filesindepth) {
            System.out.println(files);
        }

答案 1 :(得分:0)

您正在每次调用filesindepth

时初始化Filescanner()列表

在您的情况下应该只有一次。更新了运行代码

        static String path = "/tmp/aa";
        static int depth = 3;

        // initialize 'filesindepth' only once here..
        static ArrayList<String> filesindepth = new ArrayList<String>();

        public static ArrayList<String> Filescanner(File files[], int depth) {
            if (depth > 0) {

                for (File file : files) {
                    filesindepth.add(file.getAbsolutePath());
                    if (file.isDirectory()) {
                        Filescanner(file.listFiles(), depth - 1);
                    }
                }
            }
            return filesindepth;
        }

        public static void main(String[] args) {

            File[] file = new File(path).listFiles();
            Filescanner(file, depth);
            for (String files : filesindepth) {
                System.out.println(files);
            }
        }

对于目录结构:

    tmp
        '--aa
            |-- bb
            '-- cc
                '-- dd

输出就像:

的/ tmp / AA / BB

的/ tmp / AA /立方厘米

的/ tmp / AA /立方厘米/ DD