FileSystem Watcher Service

Nero90

Mitglied
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. ;)
 
Zuletzt bearbeitet:

turtle

Top Contributor
Ich meine dein Handling von Events ist nicht richtig.

Hier mal meine Version, die den Root-Ordner C: überwacht.

Java:
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;

public class Watcher {
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		try {
			WatchService watchService = FileSystems.getDefault().newWatchService();
			Path directory = Paths.get("C:\\");
			WatchKey register = directory.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
					StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE);
			for (;;) {
				// wait for key to be signaled
				WatchKey key;
				key = watchService.take();
				if (key != null) {
					for (WatchEvent<?> event : key.pollEvents()) {
						WatchEvent.Kind<?> kind = event.kind();
						WatchEvent<Path> ev = (WatchEvent<Path>) event;
						Path filename = ev.context();
						System.out.println(kind.name() + "\t" + filename);
						key.reset();
					}
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Datenbank oder Filesystem? (E-Learning) Allgemeine Java-Themen 2
E Zugriff auf Dateien im Filesystem überwachen Allgemeine Java-Themen 5
R ZIP FileSystem unter Windows wirft exception Allgemeine Java-Themen 7
I Datenbankabfrage oder Filesystem Allgemeine Java-Themen 10
lumo Filesystem Vs JAR Allgemeine Java-Themen 6
S Filesystem Hierarchy Standard Allgemeine Java-Themen 2
N Bilder in DB oder im Filesystem speichern Allgemeine Java-Themen 3
N Datenbank vs. Filesystem Allgemeine Java-Themen 5
C File System Watcher Allgemeine Java-Themen 2
izoards JAR als Windows Service mit Appache Procrun (prunsrv) Allgemeine Java-Themen 6
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
O Service oder Controller Allgemeine Java-Themen 6
OnDemand Thread / Service abbrechen Allgemeine Java-Themen 3
X Kapselung Wie würdet ihr ein Service Layer erreichbar machen ... Allgemeine Java-Themen 62
H Aufruf eines Web Service anhand übergebenen Parameter Allgemeine Java-Themen 2
K Multithreading: Service(Task), wait und continue Allgemeine Java-Themen 21
X Threads Java Chached Executors Service Allgemeine Java-Themen 12
P Entity Objekt Methoden vs Service methoden Allgemeine Java-Themen 2
K Hilfe bei GUI für Pizza-Service Allgemeine Java-Themen 11
L TV Programm API/Web Service o.ä. Allgemeine Java-Themen 6
D Java Objekt als Service in Runtime registrieren Allgemeine Java-Themen 1
W Windows (Service) Hooking Allgemeine Java-Themen 8
C Threads ExecutorService shutdown abbrechen und service "starten" ? Allgemeine Java-Themen 3
A Framework für einen Web Service Allgemeine Java-Themen 6
M Webservices: WSDL Files ohne "Service" Element? Allgemeine Java-Themen 4
D ewig laufendes Javaprogramm ("Service") Allgemeine Java-Themen 17
D Executor Service nach getaner Arbeit beenden Allgemeine Java-Themen 3
Iron Monkey Listening for Print Service Status Changes Allgemeine Java-Themen 2
D Daemon bzw. Windows Service Allgemeine Java-Themen 5
O Unterschied zwischen ThreadPoolExecutor und Executor Service Allgemeine Java-Themen 7
J url-Service timeout einrichten? Allgemeine Java-Themen 10
G Java App als Service Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben