Kein Zugriff beim Ordner löschen

Veröffentlicht von

Fehler beim löschen von einem Ordner, mit Inhalt.

Ich hatte versucht, mit meiner Java-App einen Ordner, mit Inhalt rekursiv zu löschen, aber ich hatte bei manchen Ordnern folgendes Problem, mir wurden einfach die Rechte vom Ordner entzogen, der Ordner war Schreibgeschützt und ich hatte auf den Ordner kein Zugriff mehr.

Nachdem ich meine Java-App beendet hatte, wurde der Ordner automatisch gelöscht.

 

 

 

Ich habe es mit verschiedenen Methoden versucht, z.B.:

Files.walk(filePath)
	.map(Path::toFile)
	.sorted((o1, o2) -> -o1.compareTo(o2))
	.forEach(File::delete);
Files.walk(filePath)
	.sorted(Comparator.reverseOrder())
	.map(Path::toFile)
	.peek(System.out::println)
	.forEach(File::delete);
Files.walkFileTree(filePath, new SimpleFileVisitor<Path>() {
	    
	@Override
        public FileVisitResult visitFile(Path file,
		BasicFileAttributes attrs) throws IOException {
			Files.delete(file);
			return FileVisitResult.CONTINUE;
		}
	    
	@Override
	public FileVisitResult postVisitDirectory(Path dir, IOException exc)
		throws IOException {
			Files.delete(dir);
			return FileVisitResult.CONTINUE;
		}
});
public static void deleteTree( File path ) {
	for ( File file : path.listFiles() ) {
		if ( file.isDirectory() ) {
		    deleteTree( file );
		} else {
			if ( ! file.delete() ) {
			       System.err.println( file + " could not be deleted!" );
			} 
		}		            
       }
}

oder mit der Lib von Apache „org.apache.commons.io“

FileUtils.deleteDirectory(file);

aber alles ohne Erfolg.

LÖSUNG:

Dann habe ich etwas rum probiert und bin zu diesem Ergebnis gekommen.

    private void deleteFileOrDirectory(File file) {
    	System.out.println("Del 1 fertig: " + this.getItem().getPath());
    	try {
			  if (file.isDirectory()) {
				  	int count = 0;
					while (file.exists() && count < 10) {
						
				                Files.walk(file.toPath())
							.filter(f -> f.toFile().isDirectory())
							.sorted(Comparator.reverseOrder())
							.map(Path::toFile)
							.peek(System.out::println)
							.forEach(ordner -> {
								try {
									Thread.sleep(50);
									if (ordner.exists()) {
										FileUtils.cleanDirectory(ordner);
									}									
								} catch (IOException | InterruptedException e) {
									e.printStackTrace();
								}
							});
					
						Thread.sleep(50);
						if (file.exists()) {
							FileUtils.deleteDirectory(file);
						}						
			    		count++;
			    	}
			  } else {	   				  
					FileUtils.forceDelete(file);	
					Thread.sleep(1000);
			  }
		
		} catch (IOException | InterruptedException e) {
				e.printStackTrace();
		}
	}

Diese Methode funktioniert sehr gut, der Fehler ist bis jetzt nicht wieder aufgetaucht.