Hallo,
ich habe ein kleines Problem mit einem Programm an dem ich seit längerem Arbeite, namens "DirectorySync".
Kurz zur Erklärung zum Programm:
Der Benutzer wählt zwei Verzeichnisse aus. Ein Quellverzeichnis 'a' und ein Zielverzeichnis 'b'.
In der Grundfunktion drückt der Benutzer nach der Verzeichniswahl auf Start und das Programm kopiert automatisch alle Dateien und Ordner inklusive Unterordner von a nach b. Dabei geht er in a alle Elemente durch und prüft ob das Element x aus Ordner a mit demselben Namen in Ordner b vorhanden ist. Falls nicht, wird das Element von a nach b kopiert.
Das funktioniert soweit ganz gut. Nun wollte ich das ganze durch eine "Live-Überwachung" erweitern.
Dazu habe ich mir den WatcherService ausgesucht, den es ja seit Java 1.7 gibt. Hierbei gehe ich, ähnlich wie beim Kopiervorgang, rekursiv die Ordnerstruktur durch und registriere für jeden Ordner einen WatcherService. Scheint laut Ausgabe im log zu funktionieren.
Wenn ich jetzt allerdings eine Datei erzeuge, lösche oder umbenenne bemerkt er das nicht.
Für den Anfang sollte er eine Ausgabe im Textfeld erzeugen, wenn etwas in Ordner a passiert.
Hier der Konstruktor meiner Klasse FileSystemWatcher:
[Java]
/**
* The Class constructor
* @param dirSource the source path
* @param dirTarget the target path
*/
public FileSystemWatcher(final File dirSource){
try{
ws = FileSystems.getDefault().newWatchService();
if(Main.debugMode){Main.gui.appendTaInfo("[debugInfo]: New Instance of WatcherService started.\n"); Main.gui.saveAppend("[debugInfo]: New Instance of WatcherService started.\n");}
System.out.println(dirSource.getAbsolutePath());
wk = Paths.get(dirSource.getAbsolutePath()).register(ws, new Kind<?>[] {StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE});
if(Main.debugMode){Main.gui.appendTaInfo("[debugInfo]: registered WatchService for directory "+dirSource.getAbsolutePath()+" \n"); Main.gui.saveAppend("[debugInfo]: registered WatchService for directory "+dirSource.getAbsolutePath()+" \n");}
List<WatchEvent<?>> events = wk.pollEvents();
for(WatchEvent<?> event : events){
if(Main.debugMode){Main.gui.appendTaInfo("[debugInfo]: Some event happened! \n"); Main.gui.saveAppend("[debugInfo]: Some event happened! \n");}
if(event.kind()==StandardWatchEventKinds.ENTRY_CREATE){
if(Main.debugMode){Main.gui.appendTaInfo("[debugInfo]: Created "+event.context().toString()+" \n"); Main.gui.saveAppend("[debugInfo]: Created "+event.context().toString()+" \n");}
}
if(event.kind()==StandardWatchEventKinds.ENTRY_DELETE){
if(Main.debugMode){Main.gui.appendTaInfo("[debugInfo]: Deleted "+event.context().toString()+" \n"); Main.gui.saveAppend("[debugInfo]: Deleted "+event.context().toString()+" \n");}
}
if(event.kind()==StandardWatchEventKinds.ENTRY_MODIFY){
if(Main.debugMode){Main.gui.appendTaInfo("[debugInfo]: Modified "+event.context().toString()+" \n"); Main.gui.saveAppend("[debugInfo]: Modified "+event.context().toString()+" \n");}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
Main.gui.saveAppend(e.getMessage());
e.printStackTrace();
}
//add recursive a WatchService for every subDirectory
for(File file : dirSource.toPath().toFile().listFiles(new DirectoryFilter())){
new FileSystemWatcher(file);
}
}
[/Java]
Bei Zeile 21 bis 32 sollte er eigentlich die Veränderungen erkennen und eine Ausgabe erzeugen.
Wieso passiert da nix? Ich steh irgendwie wie der Ochs vor'm Berg.^^
Falls ihr noch mehr Code braucht, oder ich euch mal zum Test das Programm schicken soll, sagt einfach bescheid.
ich habe ein kleines Problem mit einem Programm an dem ich seit längerem Arbeite, namens "DirectorySync".
Kurz zur Erklärung zum Programm:
Der Benutzer wählt zwei Verzeichnisse aus. Ein Quellverzeichnis 'a' und ein Zielverzeichnis 'b'.
In der Grundfunktion drückt der Benutzer nach der Verzeichniswahl auf Start und das Programm kopiert automatisch alle Dateien und Ordner inklusive Unterordner von a nach b. Dabei geht er in a alle Elemente durch und prüft ob das Element x aus Ordner a mit demselben Namen in Ordner b vorhanden ist. Falls nicht, wird das Element von a nach b kopiert.
Das funktioniert soweit ganz gut. Nun wollte ich das ganze durch eine "Live-Überwachung" erweitern.
Dazu habe ich mir den WatcherService ausgesucht, den es ja seit Java 1.7 gibt. Hierbei gehe ich, ähnlich wie beim Kopiervorgang, rekursiv die Ordnerstruktur durch und registriere für jeden Ordner einen WatcherService. Scheint laut Ausgabe im log zu funktionieren.
Wenn ich jetzt allerdings eine Datei erzeuge, lösche oder umbenenne bemerkt er das nicht.
Für den Anfang sollte er eine Ausgabe im Textfeld erzeugen, wenn etwas in Ordner a passiert.
Hier der Konstruktor meiner Klasse FileSystemWatcher:
[Java]
/**
* The Class constructor
* @param dirSource the source path
* @param dirTarget the target path
*/
public FileSystemWatcher(final File dirSource){
try{
ws = FileSystems.getDefault().newWatchService();
if(Main.debugMode){Main.gui.appendTaInfo("[debugInfo]: New Instance of WatcherService started.\n"); Main.gui.saveAppend("[debugInfo]: New Instance of WatcherService started.\n");}
System.out.println(dirSource.getAbsolutePath());
wk = Paths.get(dirSource.getAbsolutePath()).register(ws, new Kind<?>[] {StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE});
if(Main.debugMode){Main.gui.appendTaInfo("[debugInfo]: registered WatchService for directory "+dirSource.getAbsolutePath()+" \n"); Main.gui.saveAppend("[debugInfo]: registered WatchService for directory "+dirSource.getAbsolutePath()+" \n");}
List<WatchEvent<?>> events = wk.pollEvents();
for(WatchEvent<?> event : events){
if(Main.debugMode){Main.gui.appendTaInfo("[debugInfo]: Some event happened! \n"); Main.gui.saveAppend("[debugInfo]: Some event happened! \n");}
if(event.kind()==StandardWatchEventKinds.ENTRY_CREATE){
if(Main.debugMode){Main.gui.appendTaInfo("[debugInfo]: Created "+event.context().toString()+" \n"); Main.gui.saveAppend("[debugInfo]: Created "+event.context().toString()+" \n");}
}
if(event.kind()==StandardWatchEventKinds.ENTRY_DELETE){
if(Main.debugMode){Main.gui.appendTaInfo("[debugInfo]: Deleted "+event.context().toString()+" \n"); Main.gui.saveAppend("[debugInfo]: Deleted "+event.context().toString()+" \n");}
}
if(event.kind()==StandardWatchEventKinds.ENTRY_MODIFY){
if(Main.debugMode){Main.gui.appendTaInfo("[debugInfo]: Modified "+event.context().toString()+" \n"); Main.gui.saveAppend("[debugInfo]: Modified "+event.context().toString()+" \n");}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
Main.gui.saveAppend(e.getMessage());
e.printStackTrace();
}
//add recursive a WatchService for every subDirectory
for(File file : dirSource.toPath().toFile().listFiles(new DirectoryFilter())){
new FileSystemWatcher(file);
}
}
[/Java]
Bei Zeile 21 bis 32 sollte er eigentlich die Veränderungen erkennen und eine Ausgabe erzeugen.
Wieso passiert da nix? Ich steh irgendwie wie der Ochs vor'm Berg.^^
Falls ihr noch mehr Code braucht, oder ich euch mal zum Test das Programm schicken soll, sagt einfach bescheid.
Zuletzt bearbeitet: