递归仅查找具有 FileUtils.listFiles 的目录

2022-09-02 19:52:48

我想收集一个目录下所有文件的列表,特别是包括子目录。我喜欢不自己做事,所以我使用Apache Commons IO。所以我有这样的东西:FileUtils.listFiles

import java.io.File;
import java.util.Collection;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.TrueFileFilter;

public class TestListFiles {
  public static void main(String[] args) {
    Collection<File> found = FileUtils.listFiles(new File("foo"),
        TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
    for (File f : found) {
      System.out.println("Found file: " + f);
    }
  }
}

问题是,这似乎只找到普通文件,而不是目录:

$ mkdir -p foo/bar/baz; touch foo/one_file
$ java -classpath commons-io-1.4.jar:. TestListFiles
Found file: foo/one_file

我已经传递到两个过滤器,所以我想不出任何更具包容性的东西。我希望它列出:(以任何顺序)。TrueFileFilter"foo", "foo/one_file", "foo/bar", "foo/bar/baz"

我也会接受非解决方案,但是必须编写自己的BFS,甚至从我得到的列表中收集父目录集似乎很愚蠢。(无论如何,这都会错过空的子目录。这是在Linux,FWIW上。FileUtils


答案 1

一个旧的答案,但这对我有用:

FileUtils.listFilesAndDirs(new File(dir), TrueFileFilter.INSTANCE, DirectoryFileFilter.DIRECTORY);

显示两者:

我使用:

FileUtils.listFilesAndDirs(new File(dir), new NotFileFilter(TrueFileFilter.INSTANCE), DirectoryFileFilter.DIRECTORY)

仅显示目录而不显示文件...


答案 2

你有没有试过简单的:

File rootFolder = new File(...);
File[] folders = rootFolder.listFiles((FileFilter) FileFilterUtils.directoryFileFilter());

它似乎对我有用。当然,您将需要递归。

希望它有帮助。


推荐