Java 如何使用Apache FileFilterUtils排除特定文件? 请考虑以下文件夹结构: src |_text1.txt |_text2.txt |_content |_text1.txt |_text2.txt
如何设计org.apache.commons.io.filefilter.IOFileFilter以排除src/text1.txt和src/text2.txt,但保留src/content/text1.txt和src/content/text2.txt 当前我的筛选器如下所示:Java 如何使用Apache FileFilterUtils排除特定文件? 请考虑以下文件夹结构: src |_text1.txt |_text2.txt |_content |_text1.txt |_text2.txt,java,apache,file,filter,copy,Java,Apache,File,Filter,Copy,如何设计org.apache.commons.io.filefilter.IOFileFilter以排除src/text1.txt和src/text2.txt,但保留src/content/text1.txt和src/content/text2.txt 当前我的筛选器如下所示: IOFileFilter filter = FileFilterUtils.and( FileFilterUtils.notFileFilter(FileFilterUtils.n
IOFileFilter filter = FileFilterUtils.and(
FileFilterUtils.notFileFilter(FileFilterUtils.nameFileFilter("text1.txt", IOCase.SENSITIVE)),
FileFilterUtils.notFileFilter(FileFilterUtils.nameFileFilter("text2.txt", IOCase.SENSITIVE))
);
FileUtils.copyDirectory(new File("src"), new File("dst"), filter);
但是上面的代码片段显然也没有复制src/content/文件夹中的两个文本文件(我想复制它们)。。。顺便说一句,文本文件的名称是不可更改的
有什么想法吗?AFAIK commons io不提供类似于
路径文件过滤器的东西,因此您必须在此处添加自己的过滤器
NameFileFilter
,顾名思义,只检查文件名,即路径不相关
提供自己的过滤器不应该那么难。我建议在这里对AbstractFileFilter
或NameFileFilter
进行子类化。子类化NameFileFilter
可能被认为是一种有点脏的方法,因为您不仅要检查名称,而且只需要覆盖accept()
方法:
public boolean accept(File file) {
return accept( file.getPath() );
}
public boolean accept(File dir, String name) {
//use normalize to account for possible double separators or windows paths which use \
return accept( FilenameUtils.normalize( dir.getPath() + "/" + name ) );
}
protected boolean accept( String path ) {
for (String nameSuffix: names) {
if (caseSensitivity.checkEndsWith( path, nameSuffix )) {
return true;
}
}
return false;
}
然后您可以像使用FileFilterUtils.notFileFilter(新的PathFileFilter(“/text1.txt”))
等一样使用它
或者,您可以提供一组模式并检查这些模式:
private Set<Pattern> pathPatterns = new HashSet<>();
PathFileFilter(String... patterns) {
for( String p : patterns ) {
pathPatterns.add( Pattern.compile(p) );
}
}
protected boolean accept( String path ) {
for (Pattern pattern : pathPatterns) {
//separatorsToUnix is used to convert \ to /
if ( pattern.matches( FilenameUtils.separatorsToUnix( path ) )) {
return true;
}
}
return false;
}
private Set pathPatterns=new HashSet();
PathFileFilter(字符串…模式){
for(字符串p:模式){
pathPatterns.add(Pattern.compile(p));
}
}
受保护的布尔接受(字符串路径){
用于(模式:pathPatterns){
//分隔符tounix用于将\转换为/
if(pattern.matches(FilenameUtils.separatorsToUnix(path))){
返回true;
}
}
返回false;
}
用法:newpathfilefilter((?i)(.*/)?test[12]\\.txt”)代码>或新的PathFileFilter((?i)(.*/)?test1\\\.txt“,(?i)(.*/)?另一个Test2\\.txt”)代码>
正则表达式的简短分类:
(?i)
使表达式不区分大小写,保留它以进行区分大小写的匹配
(.*/)?
表示如果文件名前面有任何字符,则必须以斜杠结尾,即,这将匹配some/path/test1.txt
,但不匹配someothertest1.txt
test[12]\\.txt
将是文件名,这里的意思是text
,后跟1
或2
,最后是.txt