2016-07-24 14 views
-1

ich eine Struktur von verschachtelten Ordnern habenalle Dateien in verschachtelten Ordnern mit dem Namen löschen, die „_bla“

Ich möchte löschen Sie alle Dateien (nicht Ordner) in dieser Struktur enthält, die den Namen „_bla“ enthält

Hier ist mein Code, aber es ist ziemlich umständlich

Kennen Sie eine bessere Möglichkeit, das zu tun?

cleanDirectoryAccordingToBlackList(Constants.RESOURCES_PATH, ImmutableList.of("_bla")); 

und

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

Können Sie Java verwenden 8? – Dici

+0

ja. ich kann. Danke –

Antwort

0

Sie können dies mit Java 8 Streams elegant tun:

List<File> filesToDelete = 
    Files.walk(Paths.get("root")) 
     .map(Path::toFile) 
     .filter(file -> file.getName().contains("_fresh")) 
     .collect(Collectors.toList()); 

Oder es allgemeinere zu machen:

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

ich eine Ausnahme vorgeschlagen Handhabung, aber Sie möchten andere tun Auswahlmöglichkeiten je nach Anwendungsfall.

0

Hier ist eine Lösung mit

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

Das Prädikat ist redundant, da die erste Bedingung jede Datei fängt, die der zweiten Bedingung entspricht. – Dici

+0

@Dici LOL du hast recht. Danke, ich weiß nicht, wie ich das vermisst habe. –

+1

Obwohl im Code der Frage nur '_fresh' berücksichtigt wird, so nicht ganz klar: p – Dici