使用IOFileFilter发出问题

时间:2012-08-09 13:55:32

标签: java fileutils

我使用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)

谁能告诉我哪里出错了。我觉得使用过滤器有问题。我无法弄清楚

2 个答案:

答案 0 :(得分:3)

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

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

请注意,listFiles需要将文件过滤器作为其第二个参数,并将dir过滤器作为其第3个参数。在你的代码中,他们是相反的。因此,如果您不想使用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));

答案 1 :(得分:0)

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

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