我使用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)
谁能告诉我哪里出错了。我觉得使用过滤器有问题。我无法弄清楚
答案 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()
,第一个也应检查名称。