2013-05-17 4 views
11

J'utilise watchKey pour écouter un changement de fichier dans un dossier particulier.Surveiller les sous-dossiers avec un service de surveillance Java

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(); 
    } 
} 


Il fonctionne très bien pour moi. Si je modifie un fichier dans le dossier raja, il me donne le nom du fichier avec le chemin. Mais, quand je mets des fichiers dans des sous-dossiers comme "E:/Raja/Test", cela ne me donne que le chemin où je l'ai mis, pas le nom du fichier.

Comment obtenir le nom de fichier?

+2

Ceci est une copie de http://stackoverflow.com/questions/5608234/how-can-i-watch-subdirectory-for-changes-with-watch-service-java –

Répondre

0

Je sais que ce qui est laid, espérons que quelqu'un a une meilleure réponse mais vous pouvez:

Solution 1:

Créer une liste de tous les fichiers dans tous les sous-dossiers et il derniers temps modifiés.

Lorsque vous recevez ENTRY_CREATE ou ENTRY_DELETE comparer le dossier à votre liste pour savoir quel fichier a été changé

Lorsque vous recevez un ENTRY_MODIFY comparer les derniers temps modifiés.

N'oubliez pas de mettre à jour votre liste.

Edit: En tant que Sugestion C# gère la chose watcher fichier mieux

+2

La solution 2 est comme dire à votre 5 ans pour apprendre à skater car il ne peut pas faire du vélo. A peine une solution car les deux nécessitent un apprentissage. –

+0

Aucune solution 2, c'est comme dire à votre enfant de 5 ans de s'appuyer sur une planche à roulettes parce qu'il veut un vélo à 4 roues, qu'il peut tenir dans son sac à livres, se tenir debout et ranger dans son casier scolaire. J'ai fait filewatchers en Java et C#. C# fait tout simplement mieux – Nick

+3

Peut-être que C# le fait mieux, mais l'OP peut-être besoin de travailler avec Java, donc l'utilisation de C# ne serait pas une solution. Je pense que c'est une suggestion plutôt qu'une solution. –

7

La raison pour laquelle vous ne voyez un événement pour "E:/Raja/Test" et non « E:/Raja/Test/Foo. txt "(par exemple) est que vous avez seulement enregistré le répertoire" E:/Raja "avec le service. Cela signifie que vous verrez les événements sur le répertoire et ses membres immédiats. Le "E:/Raja/Test" est un membre du répertoire, et vous obtenez des événements à dire qui a été changé ... lorsque les fichiers sont ajoutés.

La solution est d'enregistrer tous les sous-répertoires de "E:/Raja" ... aussi loin que possible dans la hiérarchie des répertoires.

+1

S'il enregistre E:/Raha et E:/Raha/Test, je pense qu'il obtiendra deux événements si E: /Raja/Test/Foo.txt est créé. – Nick

+2

Oui, il le fera. Mais ce n'est pas le point. Le fait est que l'événement de l'observateur sur E:/Raha/Test lui donnera un événement CREATE le chemin complet du fichier créé, mais l'autre sera un événement MODIFY donnant le chemin du répertoire qui a été modifié. (OK ... je vais de mémoire ...) –

13

La raison pourquoi vous n'êtes pas obtenir le nom du fichier créé/modifié dans un sous-dossier est donné par Stephen C dans son answer.

Voici un exemple simple de comment pour vous inscrire répertoires et sous-répertoires pour les regarder pour les événements qui vous intéressent:

/** 
* 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; 
     } 

    }); 

} 

Découvrez Java Tutoriels officiel : Watching a Directory for Changes. Là vous pouvez trouver de très belles explications et des exemples avec le code source.

Particulièrement vous serez intéressé par cet exemple de comment regarder un répertoire (ou arborescence de répertoire) pour des changements aux fichiers: WatchDir.

La méthode que j'ai fournie ci-dessus a été prise à partir de cet exemple (en omettant certaines parties par souci de brièveté).
Lisez le didacticiel pour plus de détails.

Questions connexes