0

大家好,我需要创建一种方法来显示当前目录、文件、子目录以及给定用户必须选择的文件的这些子目录的文件。我完成了任务,下面的代码正在打印适当的输出。它是从 f.getParentFile() 向下打印的,这就是想要的。现在我想改用递归。我正在尝试学习递归的概念。我知道你需要一个基本案例,然后是你的归纳步骤,但是当我尝试将我的代码修改为递归时,当它到达第一个子目录时,我会得到一个无限循环。任何反馈将不胜感激。

非递归工作代码

static void listFiles(File f)
{
    try
    {
        if (f.exists())
        {
            File dir = f.getParentFile();

            if (dir.isDirectory())
            {
                System.out.println("Directory:  " + dir );

                File[] list = dir.listFiles();
                for (int i = 0; i < list.length; i++)
                {
                    if (list[i].isDirectory())
                    {
                        System.out.println("\tSubdirectory:  " + list[i].getName() + "\tsize :" + (list[i].length()/1024) + "KB" );
                        File[] listFiles = list[i].getAbsoluteFile().listFiles();
                        for (int j = 0; j < listFiles.length; j++)
                        {
                            System.out.println("\t\tSubdirectory files:  " + listFiles[j].getName() + "\tsize :" + (listFiles[j].length()/1024) + "KB" );
                        }
                    }
                    else if (list[i].isFile())
                    {
                        System.out.println("\tFiles:  " + list[i].getName() + "\tsize :" + (list[i].length()/1024) + "KB" );
                    }
                }
            }
        }
        else throw new FileNotFoundException("File ******** does not exists");
    }
    catch(NullPointerException | FileNotFoundException e)
    {
        e.printStackTrace();
    }
}

尝试递归

static void listFiles(File f)
{
    try
    {
        if (f.exists())
        {
            File dir = f.getParentFile();

            if (dir.isDirectory())
            {
                System.out.println("Directory:  " + dir );

                File[] list = dir.listFiles();
                for (int i = 0; i < list.length; i++)
                {
                    if (list[i].isDirectory())
                    {
                        System.out.println("\tSubdirectory:  " + list[i].getName() + "\tsize :" + (list[i].length()/1024) + "KB" );
                        listFiles(list[i].getAbsoluteFile());
                    }
                    else if (list[i].isFile())
                    {
                        System.out.println("\tFiles:  " + list[i].getName() + "\tsize :" + (list[i].length()/1024) + "KB" );
                    }
                }
            }
        }
        else throw new FileNotFoundException("File ******** does not exists");
    }
    catch(NullPointerException | FileNotFoundException e)
    {
        e.printStackTrace();
    }
}
4

1 回答 1

1

这真的很简单:)

public static void main(String[] args) {
    filesInFolder("./");
}

public static void filesInFolder(String filename) {
    File dir = new File(filename);        
    for (File child : dir.listFiles()) {
        System.out.println(child.getAbsolutePath());
        if (child.isDirectory()){
            filesInFolder(child.getAbsolutePath());
        }
    }
}
于 2013-10-24T02:04:46.637 回答