2017-08-02 1 views
1

Gibt es eine Möglichkeit in Java zu verwaisten Inodes, damit das Betriebssystem sie aufräumen kann?Lassen OS Dateien löschen

Mein Ziel ist es, einen Ordner rekursiv zu löschen, aber es spielt keine Rolle, wenn es gelöscht wird, nur dass es ist. Da das Löschen in der Zeit etwas dauert und mich langsamer macht, habe ich File.deleteOnExit() verwendet, aber das Verzeichnisskelett bleibt an Ort und Stelle. Gibt es Lösungen, die das können? Dies ist zur Zeit, was ich tue:

public static void markAllForDeletion(String folderName){ 
    String newName = folderName + " " + UUID.randomUUID().toString(); 
    new File(folderName).renameTo(new File(newName)); 
    markBelow(new File(newName)); 
} 

public static void markBelow(File folder){ 
    for(File file: folder.listFiles()){ 
     if(file.isDirectory()){ 
      markBelow(file); 
     } else { 
      file.deleteOnExit(); 
     } 
    } 
    folder.deleteOnExit(); 
} 

Antwort

2

Markieren Sie den Ordner zum Löschen, bevor eine der Ordnerinhalte Kennzeichnung:

public static void markBelow(File folder){ 
    folder.deleteOnExit(); 
    for(File file: folder.listFiles()){ 
     if(file.isDirectory()){ 
      markBelow(file); 
     } else { 
      file.deleteOnExit(); 
     } 
    } 
} 

Dies liegt daran, die Löschungen von deleteOnExit in umgekehrter Reihenfolge, wie pro the docs :

Dateien (oder Verzeichnisse) werden in der umgekehrten Reihenfolge gelöscht, die sie registriert sind.