# Ordnerüberwachung, Ordner kann nicht unbenannt werden



## stefanva (21. Juli 2019)

Guten Tag,

ich habe eine kleine Applikation geschrieben, welche einen Ordner und alle Unterordner mithilfe des WatchService überwacht. Das funktioniert auch problemlos, Änderungen in allen Ebenen werden erkannt.
Ich verwende das Programm auf einem Windows 8.1 Betriebssystem. Wenn ich nun einen überwachten Ordner(nicht den untersten in der Hierarchie) im Windows Explorer umbenenne, bekomme ich die Fehlermeldung ,,Die Aktion kann nicht abgeschlossen werden, da der Ordner (oder eine Datei darin) in einem anderen Programm geöffnet ist. Und wenn ich den Ordner löschen will, werden Administrationsberechtigungen benötig. Wenn meine Applikation nicht läuft ist das aber nicht der Fall.
Ich kann nachvollziehen woher die erste Fehlermeldung kommt, aber ich habe keine Idee wie ich diese umgehen kann.

Der Programmcode vom Überwacher ist: 

```
import java.io.File;
import java.nio.file.*;

public class Watcher extends Thread{
    private Folder _Folder;
    public Watcher(Folder folder){
        this._Folder=folder;
        start();
    }
    public void run()
    {
        try{
            WatchService watcher = FileSystems.getDefault().newWatchService();
            _Folder.getFile().toPath().register( watcher,StandardWatchEventKinds.ENTRY_CREATE,StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
            while (true) {
                WatchKey key = watcher.take();
                for (WatchEvent<?> event : key.pollEvents()){
                    File f = new File(_Folder.getFile().getPath()+"\\"+event.context());
                    if(f.isDirectory()){
                        if (event.kind()==StandardWatchEventKinds.ENTRY_DELETE){
                            System.out.println("Loeschen der Datei: "+event.context()+" - "+_Folder.getFile().getPath());
                        }else if(event.kind()==StandardWatchEventKinds.ENTRY_CREATE){
                            _Folder.newFolder(f);
                            System.out.println("Erstellen des Ordners: "+event.context());
                        }else if(event.kind()==StandardWatchEventKinds.ENTRY_MODIFY){
                            System.out.println("Inhalt des Ordners ändern: "+event.context()+" - "+_Folder.getFile().getPath());
                        }
                    }else{
                        if (event.kind()==StandardWatchEventKinds.ENTRY_DELETE){
                            System.out.println("Loeschen der Datei: "+event.context()+" - "+_Folder.getFile().getPath());
                        }else if(event.kind()==StandardWatchEventKinds.ENTRY_CREATE){
                            System.out.println("Erstellen der Datei: "+event.context()+" - "+_Folder.getFile().getPath());
                        }else if(event.kind()==StandardWatchEventKinds.ENTRY_MODIFY){
                            System.out.println("Veraendern der Datei: "+event.context()+" - "+_Folder.getFile().getPath());
                        }
                    }
                }
                key.reset();
            }
        }catch (Exception ex){
            System.out.println(ex);
        }
    }
}
```
Code von Objekt Folder: 

```
public class Folder {
    import java.io.File;
    import java.util.ArrayList;

    private ArrayList<Folder> _Folder = new ArrayList<>();
    private File _File;
    private Watcher _Watcher;
    public Folder(File file){
        _File=file;
        File[] allFiles = _File.listFiles();
        for (File f : allFiles) {
            if (f.isDirectory()) {
                _Folder.add(new Folder(f));
            }
        }
        _Watcher = new Watcher(this);
    }
    public File getFile(){
        return _File;
    }
    public void newFolder(File f){
        _Folder.add(new Folder(f));
    }
}
```
Hat jemand vielleicht eine Idee, wie man das Problem beheben kann? Gibt es vielleicht eine Möglichkeit dem Dienst als ,,unwichtig'' oder so etwas laufen zulassen, damit er auch jederzeit ohne Fehlermeldung unterbrochen werden kann?

Ich bin mit meinem Wissen ab Ende, und wäre für jede Art von Hilfe sehr dankbar.

LG Stefan


----------



## ComFreek (21. Juli 2019)

Paar Minuten Googeln mit den richtigen Begriffen (etwa: Java nio watch prevent deletion, java nio watch access deletion) 

Java7 WatchService - Access Denied error trying to delete recursively watched nested directories (Windows only)
Bug ID: JDK-6972833 (fs) WatchService delays the deletion of watch directories


----------



## stefanva (21. Juli 2019)

Auf diese Suchwörter bin ich nicht gekommen, aber vielen Dank. Ich werde es mir morgen genauer anschauen.


----------

