2013-05-17 9 views
11

Ich verwende watchKey, um auf eine Dateiänderung in einem bestimmten Ordner zu warten.Unterordner mit einem Java-Überwachungsdienst überwachen

Path _directotyToWatch = Paths.get("E:/Raja"); 
WatchService watcherSvc = FileSystems.getDefault().newWatchService(); 
WatchKey watchKey = _directotyToWatch.register(watcherSvc, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); 

while (true) { 
    watchKey=watcherSvc.take(); 
    for (WatchEvent<?> event: watchKey.pollEvents()) { 
     WatchEvent<Path> watchEvent = castEvent(event); 
     System.out.println(event.kind().name().toString() + " " + _directotyToWatch.resolve(watchEvent.context())); 
     watchKey.reset(); 
    } 
} 


Es funktioniert gut für mich. Wenn ich eine Datei im Raja-Ordner ändere gibt es den Dateinamen mit Pfad. Aber wenn ich einige Dateien in Unterordner wie "E:/Raja/Test" setze, gibt es mir nur den Pfad, wo ich es einfüge, nicht den Dateinamen.

Wie erhält man den Dateinamen?

+2

Dies ist ein Duplikat von http://stackoverflow.com/questions/5608234/how-can-i-watch-subdirectory-for-changes-with-watch-service-java –

Antwort

0

Ich weiß, das ist hässlich, hat hoffentlich jemand eine bessere Antwort, aber Sie können:

Lösung 1:

Erstellen Sie eine Liste aller Dateien in jedem Unterordner und dort verändert Zeiten dauern.

Wenn Sie erhalten ENTRY_CREATE oder ENTRY_DELETE den Ordner der Liste vergleichen, um herauszufinden, welche Datei

geändert wurde Wenn Sie ein ENTRY_MODIFY vergleichen die zuletzt Zeiten erhalten.

Denken Sie daran, Ihre Liste zu aktualisieren.

Edit: Als sugestion C# behandelt die Datei-Watcher, was besser

+2

Lösung 2 ist wie zu Ihrer 5 zu sagen Ein Jahr alt, um Skateboard fahren zu lernen, weil er kein Fahrrad fahren kann. Kaum eine Lösung, da beide lernen müssen. –

+0

Keine Lösung 2 ist wie zu deinem 5-jährigen zu sagen, wie man ein Skateboard fährt, weil er ein Fahrrad mit 4 Rädern haben möchte, dass er in seine Büchertasche passen kann, in stehender Position fahren und in seinem Schulfach verstauen kann. Ich habe Filewatchers in Java und C# gemacht. C# macht es einfach besser – Nick

+3

Vielleicht macht C# es besser, aber das OP muss vielleicht mit Java arbeiten, also wäre die Verwendung von C# keine Lösung. Ich denke, es ist eher ein Vorschlag als eine Lösung. –

7

Der Grund, warum Sie nur ein Ereignis für "E:/Raja/Test" sehen und nicht „E:/Raja/Test/Foo. txt "(zum Beispiel) ist, dass Sie nur das Verzeichnis" E:/Raja "mit dem Dienst registriert haben. Das bedeutet, dass Sie Ereignisse im Verzeichnis und seinen unmittelbaren Mitgliedern sehen werden. Der "E:/Raja/Test" ist ein Mitglied des Verzeichnisses, und Sie bekommen Ereignisse zu sagen, dass wurde geändert ... wenn Dateien hinzugefügt werden.

Die Lösung besteht darin, alle Unterverzeichnisse von "E:/Raja" ebenfalls zu registrieren ... so weit wie möglich in die Verzeichnishierarchie zu gehen.

+1

Wenn er E:/Raha und E:/Raha/Test registriert, denke ich, dass er zwei Ereignisse ausgelöst bekommt, wenn E: /Raja/Test/Foo.txt erstellt wird. – Nick

+2

Ja wird er. Aber darum geht es nicht. Der Punkt ist, dass das Ereignis vom Beobachter auf E:/Raha/Test ihm ein CREATE-Ereignis den vollständigen Pfadnamen der erstellten Datei geben wird, aber das andere wird ein MODIFY-Ereignis sein, das den Pfadnamen des Verzeichnisses angibt, das geändert wurde. (OK ... ich gehe aus dem Gedächtnis ...) –

13

Der Grund, warum Sie die Dateinamen nicht immer erstellt/in einem Unterordner geändert ist gegeben durch Stephen C in seinem answer.

Hier ist ein einfaches Beispiel für wieVerzeichnisse und Unterverzeichnisse registrieren sie für die Ereignisse zu beobachten, die Sie interessieren:

/** 
* Register the given directory, and all its sub-directories, with the WatchService. 
*/ 
private void registerAll(final Path start) throws IOException { 
    // register directory and sub-directories 
    Files.walkFileTree(start, new SimpleFileVisitor<Path>() { 

     @Override 
     public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) 
      throws IOException { 
       dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); 
       return FileVisitResult.CONTINUE; 
     } 

    }); 

} 

Schauen Sie sich die offizielle Java Tutorials : Watching a Directory for Changes. Dort finden Sie sehr schöne Erklärungen und Beispiele mit dem Quellcode.

Besonders werden Sie in diesem Beispiel von Interesse sein, wie ein Verzeichnis (oder Verzeichnisbaum) für Änderungen an Dateien zu sehen: WatchDir.

Die Methode, die ich oben geliefert habe, wurde aus diesem Beispiel entnommen (einige Teile der Kürze halber weggelassen).
Lesen Sie das Tutorial für die Details.

Verwandte Themen