Ordnerüberwachung, Ordner kann nicht unbenannt werden

stefanva

Mitglied
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:
Java:
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:
Java:
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
 

Neue Beiträge

Zurück