删除嵌套文件夹中名称包含"_bla"的所有文件



我有一个嵌套文件夹的结构

我想删除包含名称"_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();
                }
            }
        }
    }

这里有一个使用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();
             }
         });
}

您可以用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);
            }
         });
}

我提出了一个异常处理,但您可能需要根据您的用例进行其他选择。

相关内容

  • 没有找到相关文章

最新更新