2016-07-24 87 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

是的。我可以。謝謝 –

回答

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大聲笑你是對的。謝謝,我不知道我是如何失蹤的。 –

+1

儘管在問題的代碼中只考慮了「_fresh」,所以不太清楚:p – Dici

相關問題