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

时间:2016-07-24 19:56:05

标签: java file delete-file

我有嵌套文件夹的结构

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

2 个答案:

答案 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)

以下是使用

的解决方案
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();
             }
         });
}