Java中的listFiles()无法获取所有文件

时间:2015-02-18 10:04:35

标签: java list file recursion

我写了这个函数,它似乎很好但是如果当前目录中没有多个文件夹且没有文件,它就会失败。它只进入第一个文件夹并在那里工作并忽略其他文件夹。我该如何修复这个错误?

public static void getAllFiles(File folder, List<File> result) {
    File[] listOfFiles = folder.listFiles();
    for (int i = 0; i < listOfFiles.length; i++) {
        if (listOfFiles[i].isFile()) {
           result.add(listOfFiles[i]);
        }
        if (listOfFiles[i].isDirectory()) {
            getAllFiles(listOfFiles[i], result);
        }
    }
}

3 个答案:

答案 0 :(得分:4)

也许你应该从NIO.2尝试walkFileTree方法:

public List<Path> findAllFilesInDirectory(Path pathToDir) throws IOException {
    final List<Path> pathsToFiles = new ArrayList<>();

    Files.walkFileTree(pathToDir, new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
            if (Files.isRegularFile(file)) {
                pathsToFiles.add(file);
            }
            return FileVisitResult.CONTINUE;
        }
    });

    return pathsToFiles;
}

使用NIO.2您必须至少拥有Java 1.7版本。

文档:

http://docs.oracle.com/javase/tutorial/essential/io/walk.html

教程:

http://www.javabeat.net/visiting-all-the-files-and-directories-for-a-directory-in-java-using-nio2/

http://www.srccodes.com/p/article/20/java-file-and-directory-operations-made-easy-in-jdk7

答案 1 :(得分:1)

我试过它:

public void listf(String directoryName, List<File> files){ File directory = new File(directoryName) // get all the files from a directory File[] fList = directory.listFiles(); for (File file : fList) { if (file.isFile()) { files.add(file); } else if (file.isDirectory()) { listf(file.getAbsolutePath(), files); } } }

答案 2 :(得分:1)

我的代码没有问题,但您可能会遇到&#34;符号链接问题&#34; (例如&#34;我的文档&#34;在Windows上),虽然它们看起来像目录,但Java无法解析它们并且调用listXxx将返回null

话虽如此,你也可以尝试使用像...这样的东西。

public static void getAllFiles(File folder, List<File> result) {
    System.out.println(folder.getName());
    File[] listOfFiles = folder.listFiles(new FileFilter() {
        @Override
        public boolean accept(File pathname) {
            return pathname.isFile();
        }
    });
    if (listOfFiles != null && listOfFiles.length > 0) {
        result.addAll(Arrays.asList(listOfFiles));
    }
    File[] listOfFolders = folder.listFiles(new FileFilter() {
        @Override
        public boolean accept(File pathname) {
            return pathname.isDirectory();
        }
    });
    for (File subFolder : listOfFolders) {
        getAllFiles(subFolder, result);
    }
}

而不是列出文件和目录。

我相信新的nio2(FilesPaths API)有一个修复...