2016-07-24 2 views
-1

У меня есть структура вложенных папокудалить все файлы во вложенных папках с именем, которое содержит «_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(); 
       } 
      } 
     } 
    } 
+0

Вы можете использовать Java 8? – Dici

+0

да. Я могу. thanks –

ответ

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); 
      } 
     }); 
} 

Я предложил одно исключение но вы можете захотеть в зависимости от вашего прецедента.

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(); 
      } 
     }); 
} 
+0

Предикат является избыточным, поскольку первое условие поймает любой файл, соответствующий второму условию. – Dici

+0

@ Dici LOL ты прав. Спасибо, я не знаю, как мне это не хватало. –

+1

Хотя в коде вопроса учитывается только '_fresh', поэтому не совсем понятно: p – Dici

Смежные вопросы