递归列出pdf文件

时间:2015-10-12 07:39:16

标签: java list file recursion

我创建了一个检查pdf文件是否有错误的工具。该工具使用filechooser选择一个目录,检查是否有pdf文件并扫描它们。但我希望该工具以递归方式检查目录。如果我尝试这段代码:

public class RecursiveFileDisplay {

    public static void main(String[] args) {
        File currentDir = new File("C://Users//Tommy//Desktop"); // current directory
        displayDirectoryContents(currentDir);
    }

    public static void displayDirectoryContents(File dir) {
        try {
            File[] files = dir.listFiles();
            for (File file : files) {                        
                if (file.isDirectory()) {
                        displayDirectoryContents(file);

                } else {
                    if (file.getName().endsWith((".pdf"))) {
                        System.out.println("     file:" + file.getCanonicalPath());
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

该工具将向我显示桌面上每个目录的新列表,并不会将所有结果汇总到一个列表中......: 1st directorty on Desktop enter image description here

2 个答案:

答案 0 :(得分:0)

如果您希望程序创建包含所有文件的整个列表,则必须修改displayDirectoryContent方法,如下所示:

public static List<File> displayDirectoryContents(File dir) {
    ArrayList<File> rtnFiles = new ArrayList<File>();

    try {
            File[] files = dir.listFiles();

            for (File file : files) {

                    if (file.isDirectory()) {
                            rtnFiles.addAll(displayDirectoryContents(file));

                    } else {
                        if (file.getName().endsWith((".pdf"))) {
                            System.out.println("     file:" + file.getCanonicalPath());
                            rtnFiles.add(file);
                        }
                    }
            }
    } catch (IOException e) {
            e.printStackTrace();
    }

    return rtnFiles;
}

这样,它将返回找到/处理的所有文件。如果您希望此方法仅返回失败的文件,那么您不仅要检查文件是.pdf文件,还是确定/失败,然后添加到列表中。

如果要控制总和,则可以创建一个Java类,其中两个整数用于pdf找到的文件,另一个用于pdf失败的找到文件。递归地,你可以像我建立列表一样进行累积。

希望它有所帮助。

答案 1 :(得分:0)

您可以使用java.nio.file.Files.walkFileTree

import java.io.File;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.List;

public class FolderRecurs {
    public Path pathToStart = Paths.get("The_URI_OF_THE_ROOT_DIRECTORY");
    public List<File> listPDF = new ArrayList<>();
    public FolderRecurs(Path pathToStart) {
        this.pathToStart = pathToStart;
    }

    public void goRecurs() throws IOException{
        Files.walkFileTree(pathToStart, new SimpleFileVisitor<Path>() {
                //for folders
                @Override
                public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs){
                    boolean error = false;
                    //your code
                    return error?FileVisitResult.TERMINATE : FileVisitResult.CONTINUE;
                }
                //for files
                @Override
                public FileVisitResult visitFile(Path filePath, BasicFileAttributes attrs){
                    boolean error = false;
                    //Convert path to file
                    File file = filePath.toFile();
                    if (file.getName().endsWith((".pdf"))){
                        listPDF.add(file);
                    }
                    //your code
                    return error?FileVisitResult.TERMINATE : FileVisitResult.CONTINUE;
                }
        });
    }
}