如何删除指定文件集合中除匹配glob模式外的文件与目录?
实现方案
要实现排除指定Glob模式的文件/目录再执行删除,核心是先通过Glob匹配过滤待处理集合,再针对性执行删除操作,具体实现如下:
1. 利用JDK自带工具做Glob匹配
Java原生的FileSystem和PathMatcher可以直接处理Glob模式匹配,无需额外依赖,和你正在使用的Apache Commons IO兼容。
2. 过滤待删除项
遍历cleanableFiles集合时,先判断当前文件/目录是否匹配指定Glob规则,匹配的直接跳过删除流程。
3. 优化删除逻辑
原代码中deleteQuietly和deleteDirectory存在重复执行的问题:deleteDirectory用于删除非空目录,但处理文件会报错;deleteQuietly可静默删除文件或空目录,但无法处理非空目录。因此需要区分文件类型选择对应方法。
完整代码示例
import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.PathMatcher; import java.util.Set; public class FileCleanup { public void cleanExcludeGlob(Set<File> cleanableFiles, String globPattern) { // 初始化Glob匹配器,必须添加"glob:"前缀 PathMatcher globMatcher = FileSystems.getDefault().getPathMatcher("glob:" + globPattern); for (File path : cleanableFiles) { java.nio.file.Path filePath = path.toPath(); // 判断匹配规则: // - 仅匹配文件名(如*.txt):用filePath.getFileName() // - 匹配完整路径(如**/*.txt):直接用filePath if (globMatcher.matches(filePath.getFileName())) { continue; // 匹配则跳过删除 } try { if (path.isDirectory()) { FileUtils.deleteDirectory(path); // 删除非空目录 } else { FileUtils.deleteQuietly(path); // 静默删除文件 } } catch (IOException e) { // 建议添加日志记录删除失败信息,避免空捕获隐藏问题 System.err.println("删除失败:" + path.getAbsolutePath() + ",原因:" + e.getMessage()); } } } }
关键细节说明
- Glob模式示例:
*.txt:匹配当前目录下所有后缀为txt的文件**/*.txt:匹配所有层级子目录中的txt文件docs/*:匹配docs目录下的所有文件和子目录
- 匹配范围调整:如果需要基于完整路径匹配,把
globMatcher.matches(filePath.getFileName())替换为globMatcher.matches(filePath)即可。 - 异常处理:空捕获异常会掩盖删除失败的问题,建议至少打印错误日志,方便后续排查。
内容的提问来源于stack exchange,提问作者Thiccasa 69
相关产品推荐
相关产品推荐

