2016-06-27 7 views
-1

Я пишу здесь в основном для консультаций о том, с чего начать. Я уже реализовал класс, который будет рекурсивно наблюдать за каталогом с помощью WatchService Java. Он работает вполне нормально для обнаружения изменений, но я заметил фатальную ошибку: я не могу удалить каталоги, которые просматриваются, которые содержат каталоги, которые просматриваются. Это похоже на ограничение WatchService.Наблюдение за изменениями файлов и каталогов в Java

Я также немного изучил VFS FileListener Apache, но прежде чем потратить еще 6 или около того часов своего времени на создание какой-то обертки вокруг него, я подумал, может быть, я просто попрошу тех, кто более осведомлен, чем я сам ,

Мне нужно, чтобы все просмотренные каталоги были полностью обработаны, за исключением того, что просматриваемый корневой каталог не будет удален или переименован. Существует ли уже хороший класс, с которым я могу работать, для мониторинга файлов и каталогов, которые не блокируют файлы или папки? Я пытаюсь избежать подхода к опросу/хешу, но я чувствую все больше и больше, как будто мне нужно будет использовать этот подход и прожечь массу ресурсов ЦП. С чего начать? В идеале, мне нужно:

-Detect создания файлов и каталоги -Detect удаления файлов и каталоги -Detect переименования файлов и каталоги -Detect модификации файлов -Detect перемещения файлов между каталогами

Я также видел, что некоторые предполагают, что наблюдатели ненадежны и что они используют комбинацию из двух (иногда опрос в случае, если наблюдатель не сработал где-то), но человек, который звучит как настоящая боль, которую я бы предпочел избежать, t наилучшим образом. У меня есть ощущение, что мне понадобятся опрос и хеширование, тем более что я хочу обнаружить перемещение и переименование файлов, но, пожалуйста, скажите, существуют ли лучшие варианты.

Заранее благодарим за неправильный код!

+1

Посмотрите на [этот вопрос] (http://stackoverflow.com/questions/8109382/java-nio-filesystem-watcher-locks-directories-deletion-becomes-impossible) – Casey

+0

Спасибо, хотя я уже видел этот вопрос. В настоящее время я играю с добавлением модификатора FILE_TREE, специфичного для Windows, и у меня есть некоторый успех. Было бы здорово, если бы был лучший способ, хотя теперь, когда я сталкиваюсь с замечательной проблемой выяснения того, как обнаружить перемещение и переименование файлов и каталогов. В конце концов, я могу ответить на свой вопрос классом, если я потрачу достаточно долго на это. –

ответ

1

Это позволит вам экспериментировать с созданием, удаление, перемещение и переименование файлов в D: \ Temp, и позволит вам узнать, что вам нужно:

import static com.sun.nio.file.ExtendedWatchEventModifier.FILE_TREE; 
import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE; 
import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE; 
import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY; 

import java.nio.file.FileSystem; 
import java.nio.file.FileSystems; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.nio.file.WatchEvent; 
import java.nio.file.WatchKey; 
import java.nio.file.WatchService; 

public class Foo3 
{ 
    public static void main(String[] args) throws Exception 
    { 
     FileSystem fs = FileSystems.getDefault(); 
     WatchService ws = fs.newWatchService(); 
     Path pTemp = Paths.get("D:/Temp"); 
     pTemp.register(ws, new WatchEvent.Kind[] {ENTRY_MODIFY, ENTRY_CREATE, ENTRY_DELETE}, FILE_TREE); 
     while(true) 
     { 
      WatchKey k = ws.take(); 
      for (WatchEvent<?> e : k.pollEvents()) 
      { 
       Object c = e.context(); 
       System.out.printf("%s %d %s\n", e.kind(), e.count(), c); 
      } 
      k.reset(); 
     } 
    } 
}