1

フォルダーを監視するモジュールを作成したいと思います。私はいくつかのコードを書きます:

import os, pyinotify

class FileWatcher:
    def start_watch(self, dir):
        wm = pyinotify.WatchManager()
        self.notifier = pyinotify.Notifier(wm, EventProcessor())
        mask = pyinotify.IN_CREATE | pyinotify.IN_MODIFY | pyinotify.IN_DELETE | pyinotify.IN_DELETE_SELF | pyinotify.IN_MOVED_FROM | pyinotify.IN_MOVED_TO
        wdd = wm.add_watch(dir, mask, rec=True)
        while True:
            self.notifier.process_events()
            if self.notifier.check_events():
                self.notifier.read_events()

    def stop_watch(self):
        self.notifier.stop()
        print ('\nWatcher stopped')

class EventProcessor(pyinotify.ProcessEvent):
    def process_IN_CREATE(self, event):
        print('in CREATE')

    def process_IN_MODIFY(self, event):
        print('in MODIFY')

    def process_IN_DELETE(self, event):
        print('in delete')

    def process_IN_DELETE_SELF(self, event):
        print('in delete self')

    def process_IN_MOVED_FROM(self, event):
        print('in MOVED_FROM')

    def process_IN_MOVED_TO(self, event):
        print('in IN_MOVED_TO')

if __name__ == "__main__":
    watcher = FileWatcher()
    try:
        folder = "/home/user/Desktop/PythonFS"
        watcher.start_watch(folder)
    except KeyboardInterrupt:
        watcher.stop_watch()    

ファイルを変更してから削除すると、メソッド process_IN_MODIFY および process_IN_DELETE が呼び出されませんでした。どのように私はそれを解決しますか?

しかし、ファイルを作成すると、メソッド process_IN_CREATE() が呼び出されました。

OSはLinux mint13です。

UPD: 新しいコード

4

1 に答える 1

1

次のコードを試してください。基本的にコードと同じです。追加しただけ

f = FileWatcher()
f.start_watch('/tmp/test', None)

最後に を開始しFileWatcherます。ディレクトリが存在することを確認するか、/tmp/test存在しないディレクトリを指すようにその行を変更してください。

にファイルfooが存在し/tmp/test、このファイルを変更すると、上記のプログラムが出力されます

in create   # after modification
in modify   # after saving
in modify
in delete

ファイルを削除すると、プログラムは次のように出力します。

in delete

import os
import pyinotify


class FileWatcher:
    notifier = None

    def start_watch(self, dir, callback):
        wm = pyinotify.WatchManager()
        self.notifier = pyinotify.Notifier(wm, EventProcessor(callback))
        mask = (pyinotify.IN_CREATE | pyinotify.IN_MODIFY | pyinotify.IN_DELETE
                | pyinotify.IN_DELETE_SELF | pyinotify.IN_MOVED_FROM
                | pyinotify.IN_MOVED_TO)
        wdd = wm.add_watch(dir, mask, rec=True)
        while True:
            self.notifier.process_events()
            if self.notifier.check_events():
                self.notifier.read_events()


class EventProcessor(pyinotify.ProcessEvent):
    def __init__(self, callback):
        self.event_callback = callback

    def process_IN_CREATE(self, event):
        # if self.event_callback is not None:
        # self.event_callback.on_file_created(os.path.join(event.path,
        # event.name))
        print('in create')

    def process_IN_MODIFY(self, event):
        # if self.event_callback is not None:
        # self.event_callback.on_file_modifed(os.path.join(event.path,
        # event.name))
        print('in modify')

    def process_IN_DELETE(self, event):
        print('in delete')

    def process_IN_DELETE_SELF(self, event):
        print('in delete self')

    def process_IN_MOVED_FROM(self, event):
        print('in moved_from')

    def process_IN_MOVED_TO(self, event):
        print('in moved to')


f = FileWatcher()
f.start_watch('/tmp/test', None)

ちなみに、一度呼び出すとループf.start_watchに陥って抜けられなくなります。while True別のスレッドから呼び出してもf.stop_watch、この while ループから抜け出すことはできません。

スレッド化を使用する予定がある場合は、 を に渡し、threading.Eventstart_watchの状態をチェックして、while-loopいつループを抜け出すかを判断する必要がある場合があります。

于 2013-03-26T17:29:47.050 に答える