我有嵌套文件夹的结构
我想删除该结构中包含名称" _bla"
的所有文件(不是文件夹)这是我的代码,但它非常麻烦
你知道一种更简洁的方法吗?
cleanDirectoryAccordingToBlackList(Constants.RESOURCES_PATH, ImmutableList.of("_bla"));
和
public void cleanDirectoryAccordingToBlackList(String root, List<String> blackList) {
File dir = new File(root);
if (dir.isDirectory()) {
File[] files = dir.listFiles();
if (files != null && files.length > 0) {
for (File aFile : files) {
removeFilesInDirectory(aFile, blackList);
}
}
}
}
public void removeFilesInDirectory(File file, List<String> blackList) {
if (file.isDirectory()) {
File[] files = file.listFiles();
if (files != null && files.length > 0) {
for (File aFile : files) {
removeFilesInDirectory(aFile, blackList);
}
}
} else {
for (String name : blackList) {
if (file.getName().contains(name)) {
file.delete();
}
}
}
}
答案 0 :(得分:0)
您可以使用Java 8流优雅地完成此任务:
List<File> filesToDelete =
Files.walk(Paths.get("root"))
.map(Path::toFile)
.filter(file -> file.getName().contains("_fresh"))
.collect(Collectors.toList());
或者使其更通用:
cleanMatchingFilesUnderRoot(file -> file.getName().contains("_fresh"));
public void cleanMatchingFilesUnderRoot(String root, Predicate<File> predicate) {
Files.walk(Paths.get(root))
.map(Path::toFile)
.filter(predicate.and(File::isFile))
.forEach(file -> {
try {
boolean deleted = file.delete();
LOG.warn(file.getAbsolutePath() + " was not deleted");
} catch (IOException e) {
LOG.warn(file.getAbsolutePath() + " could not be deleted", e);
}
});
}
我提出了一个异常处理,但您可能希望根据您的用例做出其他选择。
答案 1 :(得分:0)
以下是使用java-8
的解决方案public static void main(String[] args) throws Exception {
Files.walk(Paths.get("D:\\"), FileVisitOption.FOLLOW_LINKS)
.filter(f -> f.toFile().isFile() &&
f.getFileName().toString().contains("fresh"))
.forEach(f -> {
try{
Files.delete(f);
} catch (IOException ioe) {
ioe.printStackTrace();
}
});
}