18

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

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"以任何顺序)。

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

4

6 回答 6

21

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

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

显示两者:

我用:

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

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

于 2012-10-17T16:21:08.433 回答
8

您是否简单地尝试过:

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

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

希望能帮助到你。

于 2011-02-01T10:24:30.173 回答
6

在我的大多数重要应用程序中,我避免使用 Java IO 库,而是更喜欢 Commons VFS。我相信使用适当的参数调用此方法将实现您的目标,但我会授予它很长的路要走的功能。

具体来说,此代码将执行您想要的操作:

    FileObject[] files = fileObject.findFiles(new FileSelector() {
        public boolean includeFile(FileSelectInfo fileInfo)  {
            return fileInfo.getFile().getType() == FileType.FOLDER; }

        public boolean traverseDescendents(FileSelectInfo fileInfo) {
            return true;
        }
    });

其中 fileObject 是 FileObject 的一个实例。

于 2009-05-23T04:23:54.880 回答
6

如果您查看源代码并阅读 JavaDoc 中的字里行间,您会发现——不幸的是——这个 API 并不是为满足您的需要而设计的。它将返回与提供的参数匹配的文件列表(不是文件和目录列表)。在源代码中——查看方法innerListFiles——你会看到目录被搜索并且没有被添加到结果列表中。

我不知道有任何公共 API 可以满足您的需求。希望其他人会知道一个。大多数可能是 DFS,而不是 BFS,这可能对您的目的很重要,也可能无关紧要。(到目前为止,我看过的所有执行目录树遍历的 Java 代码都是通过深度优先搜索来完成的。当然,这并不意味着 BFS 不存在。)

如果您真的想要一个给定目录下所有内容的列表,那么滚动您自己的很容易。但我理解你不想重新发明轮子的愿望。

注意:Apache Commons Finder可能会支持您需要的内容,但该库位于 Commons Sandbox 中,这意味着它在此阶段更具实验性。它可能是完整的,也可能不是完整的,它可能会或可能不会被维护。对于您正在寻找的东西,它也可能是重量级的。

于 2009-05-23T02:45:50.037 回答
1

一个更简单+完整的Commons VFS解决方案:

FileSystemManager fsManager = VFS.getManager();
FileObject fileObject = fsManager.resolveFile( "yourFileNameHere" );
FileObject[] files = fileObject.findFiles( new FileTypeSelector( FileType.FOLDER ) )
于 2010-02-05T23:53:21.307 回答
0

根据他们的 API,它应该可以工作。

这是我自己的FileUtils版本,不如 Commons IO 完整,它只包含我需要的内容。搜索findFiles或者您可以使用iterate来避免创建巨大的列表(有时/大部分时间您只想对这些文件做一些事情,因此将它们收集在 List 中没有意义)。

于 2009-05-23T02:32:49.313 回答