Повторяющиеся события сторожевого таймера Python

Я создал модифицированный пример сторожевого таймера для отслеживания файла фотографий.jpg, которые были добавлены в определенный каталог в Windows.

import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

paths = []

xp_mode = 'off'

class FileHandler(FileSystemEventHandler):

    def on_created(self, event):
        if xp_mode == 'on':
            if not event.is_directory and not 'thumbnail' in event.src_path:
                print "Created: " + event.src_path
                paths.append(event.src_path)

    def on_modified(self, event):
        if not event.is_directory and not 'thumbnail' in event.src_path:
            print "Modified: " + event.src_path
            paths.append(event.src_path)

if __name__ == "__main__":
    path = 'C:\\'
    event_handler = FileHandler()
    observer = Observer()
    observer.schedule(event_handler, path, recursive=True)
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observe r.stop()

    observer.join()

Одна из вещей, которые я заметил, что при добавлении файла вызывается как on_created, так и on_modified! Чтобы решить эту проблему, я решил использовать только метод on_modified. Тем не менее, я начинаю замечать, что это также вызывает несколько обратных вызовов, но на этот раз для метода on_modified!

Modified: C:\images\C121211-0008.jpg
Modified: C:\images\C121211-0009.jpg
Modified: C:\images\C121211-0009.jpg <--- What?
Modified: C:\images\C121211-0010.jpg
Modified: C:\images\C121211-0011.jpg
Modified: C:\images\C121211-0012.jpg
Modified: C:\images\C121211-0013.jpg

Я не могу понять на всю жизнь, почему это происходит! Кажется, это тоже не соответствует. Если кто-то может пролить свет на этот вопрос, он будет очень признателен.

Был похожий пост, но это было для Linux: Python Watchdog модифицировал и создал повторяющиеся события

1 ответ

Решение

Когда процесс записывает файл, он сначала создает его, а затем записывает содержимое по частям за раз.

То, что вы видите, представляет собой набор событий, соответствующих этим действиям. Иногда части пишутся достаточно быстро, чтобы Windows отправляла только одно событие для всех них, а в других случаях вы получаете несколько событий.

Это нормально... в зависимости от того, что должен делать окружающий код, возможно, имеет смысл сохранить set измененных путей, а не list,

Другие вопросы по тегам