0

我使用 Apache FileUtils 和 IOFileFilter 以递归方式列出文件夹下的所有文件,不包括 .svn 文件夹。这是我尝试过的代码

File selectedFolder = new File(path);\\path to folder to list
        final IOFileFilter dirs = new IOFileFilter() {
            @Override
            public boolean accept(File file, String s) {
                return file.isDirectory();
            }

            @Override
            public boolean accept(File file) {
                // TODO Auto-generated method stub
                if(file.getName().toLowerCase().equalsIgnoreCase(".svn")||file.getName().toLowerCase().contains(".svn"))

                return false;
                else return true;
            }



        };
        filesList.addAll(FileUtils.listFiles(selectedFolder,dirs, TrueFileFilter.INSTANCE));

我收到错误

java.lang.IllegalArgumentException: Parameter 'directory' is not a directory
    at org.apache.commons.io.FileUtils.validateListFilesParameters(FileUtils.java:545)
    at org.apache.commons.io.FileUtils.listFiles(FileUtils.java:521)

谁能告诉我哪里出错了。我觉得使用的过滤器有问题。我想不通

4

2 回答 2

3

实际上,FileFilterUtils 包含一个可以使用的名为 makeSVNAware 的方法。它返回一个忽略 SVN 目录的过滤器。例如:

filesList.addAll(
    FileUtils.listFiles(selectedFolder, TrueFileFilter.TRUE,
            FileFilterUtils.makeSVNAware(null)));

注意 listFiles 需要一个文件过滤器作为它的第二个参数,一个 dir 过滤器作为它的第三个参数。在您的代码中,它们是相反的。因此,如果您不想使用 makeSVNAware,您的代码将如下所示:

File selectedFolder = new File(path); // path to folder to list

final IOFileFilter dirs = new IOFileFilter() {
    @Override
    public boolean accept(File file, String s) {
        return file.isDirectory();
    }

    @Override
    public boolean accept(File file) {
        return (!file.getName().toLowerCase().equalsIgnoreCase(".svn"));
    }

};
// 2nd argument: TRUE filter, returning all files
// 3rd argument: dirs filter, returning all directories except those named .svn
filesList.addAll(FileUtils.listFiles(selectedFolder, TrueFileFilter.TRUE, dirs));
于 2012-08-09T21:10:35.717 回答
0

看起来您已将功能拆分为两个功能。

第二个也应该检查,isDirectory()第一个也应该检查名称。

于 2012-08-09T14:00:48.107 回答