Ordnerüberwachnung

stefan.v

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
 

White_Fox

Top Contributor
Nein, eine Idee hab ich nicht. Außer vielleicht mal zu schauen wie die Jungs von TortoiseSVN das Problem lösen. Auch wenn es nicht inJava geschrieben ist.
 

Thallius

Top Contributor
das kann irgendwie ja auch nicht funktionieren. Was meinste was mit deiner App passiert wenn man ihr einfach ein File unter dem Ar... wegzieht für den es einen Watcher gibt? Das Dingen würde sowas von crashen.
 

White_Fox

Top Contributor
Wenn die App nur Lesezugriff beantragt hat und deren Überleben von der Datei nicht abhängt, dann schon.

Es gibt so viele Programme, die Dateien auf Veränderungen überwachen, ohne daß sie wirkich geöffnet sind: TortoiseSVN ist so eines, außerdem Altium (ECAD), oder die meisten (wenn nicht alle?) IDEs. Zumindest Netbeans macht das so (@stefan.v daß ist doch eine Anlaufstelle) oder Embedded Studio. Du kannst ja mal eine Datei erst in Netbeans öffnen und dann nochmal im Texteditor.
Wenn du dann die Datei im Texteditor änderst und abspeicherst, kommt eine Meldung daß die Datei extern geändert wurde und du wirst gefragt, ob du die Datei neu laden willst.
 

Neue Themen


Oben