2016-10-13 3 views
-1

ich die folgenden Dateien gelöscht und Ordner-Struktur:Java WatchService Dateien nicht melden, wenn das übergeordnete Verzeichnis

/root/ 

/root/pictures/ 

/root/pictures/picture1.jpg 

/root/pictures/picture2.jpg 

ich registrierte zwei WatchServices, einen für die /root/ Ordner und einen für /root/pictures. Für beide registrierte ich die Ereignisse: ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY.

Wenn ich löschen /root/pictures/ Ich erwarte ein ENTRY_DELETE Ereignis für das Löschen des Ordners für picture1.jpg und picture2.jpg/root/pictures/ und zwei ENTRY_DELETE Ereignisse zu erhalten. Tatsächlich bekomme ich nur das ENTRY_DELETE Ereignis für /root/pictures/. Wenn ich nur picture1.jpg lösche, erhalte ich wie erwartet ein Lösch-Ereignis.

Ist das normales Verhalten? Wie kann ich mit WatchService die Liste der Dateien abrufen, die sich in einem gelöschten Ordner befanden?

Antwort

0

Sie haben keinen Code angezeigt, daher wissen wir nicht, wie Sie versucht haben, ihn zu implementieren es enthält nur ein WatchService, für Verzeichnis xxx/yyy; ich nicht die anderen WatchService für Verzeichnis xxx enthalten sind)

public class WatchServiceApp { 

    public static void main(String[] args) throws IOException { 
     WatchService watchService = FileSystems.getDefault().newWatchService(); 
     Path dirPath = Paths.get("/home/myuser/xxx/yyy"); 
     WatchKey watchKey = dirPath.register(
       watchService, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); 

     while (true) { 
      try { 
       watchService.take(); 
      } catch (InterruptedException ex) { 
       break; 
      } 

      List<WatchEvent<?>> watchEventList = watchKey.pollEvents(); 
      for (WatchEvent<?> watchEvent : watchEventList) { 
       Path filePath = (Path) watchEvent.context(); 
       System.out.println("Event " + watchEvent.kind() + " for " + filePath.toString()); 
      } 

      boolean watchKeyValid = watchKey.reset(); 
      if (!watchKeyValid) { 
       break; 
      } 
     } 
    } 

} 

Ermöglicht das Verzeichnis xxx/yyy enthält drei Dateien übernehmen. Zuerst haben wir einzelne file3 löschen und bekommen

Event ENTRY_DELETE for file3 

dann löschen wir das gesamte yyy Verzeichnis und erhalten

Event ENTRY_DELETE for file2 
Event ENTRY_DELETE for file1 
+0

Dank für Ihren Code. Das ist wirklich interessant, denn es funktioniert nicht wie erwartet für mich. Wenn ich den überwachten Ordner lösche, stoppt das Programm und gibt keine Ausgabe aus. Wenn ich nur eine einzelne Datei im überwachten Ordner lösche, erhalte ich die Ausgabe. – bamboofighter

+0

Ich sollte hinzufügen, dass ich den Code unter Mac OS 10.12 ausführen. Könnte es sich um einen Fehler handeln, der nur unter Mac OS auftritt? – bamboofighter

+0

Sie erhalten die Ereignisse für die Einträge im Verzeichnis, nicht jedoch für das Verzeichnis selbst. In Ihrem Code erhalten Sie auch ein Ereignis für das Verzeichnis selbst, da Sie einen anderen WatchService für das übergeordnete Verzeichnis erstellt haben. Deshalb habe ich betont, dass WatchService in meinem Code nicht vorhanden ist. OS sollte in dieser Hinsicht wahrscheinlich keinen Unterschied machen. – hammerfest

Verwandte Themen