StandardWatchEvents.ENTRY_MODIFY задейства с модифициране на подпапка?

Пример: Имам моя работен плот с подпапка „Desktop/sub“

ако е регистриран само Desktop и след стартиране на WatchService променям съдържанието на подпапка.. трябва ли да задейства ENTRY_MODIFY или не? Опитах и ​​не става. Работи само за модифициране на файл в регистрираната папка (в този случай работен плот).

Просто задавам този въпрос, защото в пробния изпит за OCPJP7 се казва, че всъщност дори модифицирането на подпапка като „Desktop/sub“, например премахване на файл в „Desktop/sub“, трябва да задейства събитието.

Обаче отново го пробвах и не работи.

Ето кода:

WatchKey key = ws.poll(5, TimeUnit.SECONDS);

if (key ==null)
{
    continue;
}
List<WatchEvent<?>> lista = key.pollEvents();

for (WatchEvent<?> event : lista)
{
    switch(event.kind().toString())
    {
    case "ENTRY_CREATE": System.out.println("There has been a creation over here: "+event.context());break;
    case "ENTRY_MODIFY": System.out.println("There has been a modification over here: "+event.context());break;
    case "ENTRY_DELETE": System.out.println("There has been a deletion over here: "+event.context());

    }

    key.reset();
}

Благодаря предварително.


person Rollerball    schedule 02.09.2013    source източник


Отговори (1)


WatchService преглежда само модификациите на файла и папката в регистрираните Paths.

Ако сте се регистрирали

WatchService service = FileSystems.getDefault().newWatchService();
Path path = Paths.get("/Desktop");
path.register(service, StandardWatchEventKinds.ENTRY_MODIFY);

След това ще се види добавянето на папка към Desktop. Промяната на файл в Desktop ще се види. Добавянето на папка към Desktop/Subs също ще се види, тъй като папката Subs в Desktop е променена. Въпреки това, модифицирането на файл в Desktop/Subs няма да се види, защото този път не е регистриран в услугата.

Винаги можете да регистрирате всички пътища под Desktop рекурсивно

private void registerRecursive(final Path root) throws IOException {
    // register all subfolders
    Files.walkFileTree(root, new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                dir.register(watchService, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
                return FileVisitResult.CONTINUE;
        }
    });
}

Не съм опитвал на Linux, но следното работи на Windows

public static void main(String[] args) throws Exception {   

    WatchService service = FileSystems.getDefault().newWatchService();
    Path path = Paths.get("/Desktop");
    path.register(service, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_CREATE);
    WatchKey key = null;
    while(true) {
        key = service.take();

        List<WatchEvent<?>> lista = key.pollEvents();

        for (WatchEvent<?> event : lista)
        {
            switch(event.kind().toString())
            {
            case "ENTRY_CREATE": System.out.println("There has been a creation over here: "+event.context());break;
            case "ENTRY_MODIFY": System.out.println("There has been a modification over here: "+event.context());break;
            case "ENTRY_DELETE": System.out.println("There has been a deletion over here: "+event.context());

            }

            key.reset();
        }
    }
}
person Sotirios Delimanolis    schedule 02.09.2013
comment
Опитах се да добавя както файл, така и директория към Desktop/sub и ENTRY.MODIFY не задейства нищо. Въпреки това работи, ако модифицирам файл в работния плот. Кодът, който използвам, е публикуван по-горе. Използвам ubuntu 12.10 - person Rollerball; 02.09.2013
comment
@Rollerball Кое StandardWatchEventKinds си декларирал? - person Sotirios Delimanolis; 02.09.2013
comment
всички от тях, ако модифицирам файл в работния плот, той задейства събитието - person Rollerball; 02.09.2013
comment
само ако добавя файл или премахна файл/директория в Desktop/Sub, това не задейства нищо. - person Rollerball; 02.09.2013
comment
Трябва да регистрирате пътя си като path.register(service, ENTRY_MODIFY, ENTRY_CREATE, ENTRY_DELETE);. Където path е Path обект за /Desktop. Добавянето или изтриването на файл в Desktop/Sub ще задейства събитие. Моля, проверете дали имате правилната WatchService настройка. - person Sotirios Delimanolis; 02.09.2013
comment
Проверих два пъти и също така ви казах, че модифицирането на файл в Desktop го задейства. - person Rollerball; 02.09.2013
comment
Мисля, че може да зависи от операционната система, аз съм на ubuntu 12.10 - person Rollerball; 02.09.2013
comment
@ROllerball На windows, да, задейства ги, с кода, който добавих при последната си редакция. Съмнявам се, че Linux би предотвратил тази функционалност. Мисля, че е гарантирано от API, дори ако основната реализация е различна. - person Sotirios Delimanolis; 02.09.2013
comment
мм виждам. Имам супер двойна проверка и освен ако не използвам рекурсивния начин. Не се задейства за промяна в поддиректория на регистрираната директория.. в този момент бих искал да чуя друг потребител, който използва linux - person Rollerball; 02.09.2013