gpt4 book ai didi

java - 如何使用 Apache FileFilterUtils 排除特定文件?

转载 作者:行者123 更新时间:2023-12-01 12:18:00 25 4
gpt4 key购买 nike

请考虑以下文件夹结构:

src
|_text1.txt
|_text2.txt
|_content
|_text1.txt
|_text2.txt

我如何设计一个org.apache.commons.io.filefilter.IOFileFilter来排除src/text1.txtsrc/text2 .txt 但保留 src/content/text1.txtsrc/content/text2.txt

目前我的过滤器如下所示:

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 不提供类似 PathFileFilter 之类的东西,因此您必须在此处添加自己的过滤器。

NameFileFilter,顾名思义,只检查文件名,即路径不相关。

提供您自己的过滤器应该不那么难。我建议在这里子类化 AbstractFileFilterNameFileFilter 。子类化 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(new 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;
}

用法:new PathFileFilter("(?i)(.*/)?test[12]\\.txt");new PathFileFilter("(?i)( .*/)?test1\\.txt", "(?i)(.*/)?anothertest2\\.txt");

正则表达式的简短分解:

  • (?i) 使表达式不区分大小写,忽略大小写匹配
  • (.*/)? 表示如果文件名前面有任何内容,则必须以斜杠结尾,即这将匹配 some/path/test1.txt但不是 someothertest1.txt
  • test[12]\\.txt 是文件名,这里的意思是 text 后跟 12 最后是 .txt

关于java - 如何使用 Apache FileFilterUtils 排除特定文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26865775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com