import os, pyinotify
import pdb
class FileWatcher:
notifer = 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()
def stop_watch(self):
self.notifier.stop()
print ('\nWatcher stopped')
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))
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))
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')
aW1wb3J0IG9zLCBweWlub3RpZnkKaW1wb3J0IHBkYgoKY2xhc3MgRmlsZVdhdGNoZXI6Cm5vdGlmZXIgPSBOb25lCgpkZWYgc3RhcnRfd2F0Y2goc2VsZiwgZGlyLCBjYWxsYmFjayk6CiAgICB3bSA9IHB5aW5vdGlmeS5XYXRjaE1hbmFnZXIoKQogICAgc2VsZi5ub3RpZmllciA9IHB5aW5vdGlmeS5Ob3RpZmllcih3bSwgRXZlbnRQcm9jZXNzb3IoY2FsbGJhY2spKQoKICAgIG1hc2sgPSBweWlub3RpZnkuSU5fQ1JFQVRFIHwgcHlpbm90aWZ5LklOX01PRElGWSB8IHB5aW5vdGlmeS5JTl9ERUxFVEUgfCBweWlub3RpZnkuSU5fREVMRVRFX1NFTEYgfCBweWlub3RpZnkuSU5fTU9WRURfRlJPTSB8IHB5aW5vdGlmeS5JTl9NT1ZFRF9UTwogICAgd2RkID0gd20uYWRkX3dhdGNoKGRpciwgbWFzaywgcmVjPVRydWUpCiAgICB3aGlsZSBUcnVlOgogICAgICAgIHNlbGYubm90aWZpZXIucHJvY2Vzc19ldmVudHMoKQogICAgICAgIGlmIHNlbGYubm90aWZpZXIuY2hlY2tfZXZlbnRzKCk6CiAgICAgICAgICAgIHNlbGYubm90aWZpZXIucmVhZF9ldmVudHMoKQoKZGVmIHN0b3Bfd2F0Y2goc2VsZik6CiAgICBzZWxmLm5vdGlmaWVyLnN0b3AoKQogICAgcHJpbnQgKCdcbldhdGNoZXIgc3RvcHBlZCcpCgpjbGFzcyBFdmVudFByb2Nlc3NvcihweWlub3RpZnkuUHJvY2Vzc0V2ZW50KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYWxsYmFjayk6CiAgICAgICAgc2VsZi5ldmVudF9jYWxsYmFjayA9IGNhbGxiYWNrCgogICAgZGVmIHByb2Nlc3NfSU5fQ1JFQVRFKHNlbGYsIGV2ZW50KToKICAgICAgICBpZiBzZWxmLmV2ZW50X2NhbGxiYWNrIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmV2ZW50X2NhbGxiYWNrLm9uX2ZpbGVfY3JlYXRlZChvcy5wYXRoLmpvaW4oZXZlbnQucGF0aCwgZXZlbnQubmFtZSkpCgogICAgZGVmIHByb2Nlc3NfSU5fTU9ESUZZKHNlbGYsIGV2ZW50KToKICAgICAgICBpZiBzZWxmLmV2ZW50X2NhbGxiYWNrIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmV2ZW50X2NhbGxiYWNrLm9uX2ZpbGVfbW9kaWZlZChvcy5wYXRoLmpvaW4oZXZlbnQucGF0aCwgZXZlbnQubmFtZSkpCgogICAgZGVmIHByb2Nlc3NfSU5fREVMRVRFKHNlbGYsIGV2ZW50KToKICAgICAgICBwcmludCgnaW4gZGVsZXRlJykKCiAgICBkZWYgcHJvY2Vzc19JTl9ERUxFVEVfU0VMRihzZWxmLCBldmVudCk6CiAgICAgICAgcHJpbnQoJ2luIGRlbGV0ZSBzZWxmJykKCiAgICBkZWYgcHJvY2Vzc19JTl9NT1ZFRF9GUk9NKHNlbGYsIGV2ZW50KToKICAgICAgICBwcmludCgnaW4gbW92ZWRfZnJvbScpCgogICAgZGVmIHByb2Nlc3NfSU5fTU9WRURfVE8oc2VsZiwgZXZlbnQpOgogICAgICAgIHByaW50KCdpbiBtb3ZlZCB0bycp