class TestFSMonitor(object): def __init__(self): self.__monitor = FSMonitorThread(self.__callback) self.__lock = threading.Lock() self.__events = [] def __callback(self, evt): with self.__lock: self.__events.append(evt) @property def events(self): with self.__lock: return list(self.__events) def add_dir_watch(self, *args, **kwargs): return self.__monitor.add_dir_watch(*args, **kwargs) def add_file_watch(self, *args, **kwargs): return self.__monitor.add_file_watch(*args, **kwargs) def remove_watch(self, *args, **kwargs): self.__monitor.remove_watch(*args, **kwargs) def event_happened(self, action=None, name=None, path=None): for evt in self.events: if (name is None or evt.name == name) \ and (action is None or evt.action == action) \ and (path is None or evt.path == path): return True return False
class FSMonitorTest(object): def __init__(self, fsmonitor_class=None): self.monitor = FSMonitorThread(self.__callback, fsmonitor_class=fsmonitor_class) self._lock = threading.Lock() self._events = [] def __callback(self, evt): with self._lock: self._events.append(evt) @property def events(self): with self._lock: return list(self._events) def add_dir_watch(self, *args, **kwargs): return self.monitor.add_dir_watch(*args, **kwargs) def add_file_watch(self, *args, **kwargs): return self.monitor.add_file_watch(*args, **kwargs) def remove_watch(self, *args, **kwargs): self.monitor.remove_watch(*args, **kwargs) def event_happened(self, action=None, name=None, path=None): for evt in self.events: if (name is None or evt.name == name) \ and (action is None or evt.action == action) \ and (path is None or evt.path == path): return True return False
class Monitor: def __init__(self, callback=run_commands): self.__monitor = FSMonitorThread(callback) self.events = FSEvent.Create | FSEvent.Modify self.callback = callback def add_dir_watch(self, path, subfolders=False): def recursive_adder(path): self.__monitor.add_dir_watch(path, self.events) print "Adding subfolder: " + path for f in os.listdir(path): full_path = os.path.join(path, f) if os.path.isdir(full_path): recursive_adder(full_path) if not subfolders: self.__monitor.add_dir_watch(path, self.events) else: recursive_adder(path) def remove_watch(self, path): return self.__monitor.remove_watch(path) def remove_all_watches(self): return self.__monitor.remove_all_watches() def run(self): return self.__monitor.run() def stop(self): return self.__monitor.stop() def read_events(self): return self.__monitor.read_events()
class DemoFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, title="FSMonitor wxWidgets Demo", size=(600, 800)) self.list = wx.ListBox(self) btn_add = wx.Button(self, label="&Add") btn_remove = wx.Button(self, label="&Remove") btn_clear = wx.Button(self, label="&Clear") self.log = wx.TextCtrl(self, style=wx.TE_MULTILINE|wx.TE_READONLY|wx.TE_DONTWRAP) btnsizer = wx.BoxSizer(wx.HORIZONTAL) btnsizer.AddStretchSpacer() btnsizer.Add(btn_add, 0, wx.ALL, 5) btnsizer.Add(btn_remove, 0, wx.RIGHT | wx.TOP | wx.BOTTOM, 5) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(wx.StaticText(self, label="Directories to monitor:"), 0, wx.LEFT | wx.RIGHT | wx.TOP, 5) sizer.Add(self.list, 1, wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, 5) sizer.Add(btnsizer, 0, wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, 5) sizer.Add(wx.StaticText(self, label="Monitor log:"), 0, wx.LEFT | wx.RIGHT, 5) sizer.Add(self.log, 2, wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, 5) sizer.Add(btn_clear, 0, wx.ALIGN_RIGHT | wx.LEFT | wx.RIGHT | wx.BOTTOM, 5) self.SetSizer(sizer) self.Bind(wx.EVT_CLOSE, self.OnClose) self.Bind(wx.EVT_BUTTON, self.OnAdd, btn_add) self.Bind(wx.EVT_BUTTON, self.OnRemove, btn_remove) self.Bind(wx.EVT_BUTTON, self.OnClear, btn_clear) self.monitor = FSMonitorThread(callback=lambda event: wx.CallAfter(self.OnFSEvent, event)) def OnClose(self, evt): self.Hide() self.monitor.stop() self.Destroy() def AddPath(self, path): try: watch = self.monitor.add_dir_watch(path) except OSError as e: dlg = wx.MessageDialog(self, str(e), "Error", wx.OK | wx.ICON_ERROR) dlg.ShowModal() dlg.Destroy() else: self.list.Append(path, watch) def OnAdd(self, evt): dlg = wx.DirDialog(self) try: if dlg.ShowModal() == wx.ID_OK: self.AddPath(dlg.GetPath()) finally: dlg.Destroy() def OnRemove(self, evt): selection = self.list.GetSelection() if selection != wx.NOT_FOUND: watch = self.list.GetClientData(selection) self.monitor.remove_watch(watch) self.list.Delete(selection) def OnClear(self, evt): self.log.Clear() def OnFSEvent(self, evt): path = os.path.join(evt.watch.path, evt.name) message = "%s %s\n" % (evt.action_name, path) self.log.AppendText(message)
class DemoFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, title="FSMonitor wxWidgets Demo", size=(600, 800)) self.list = wx.ListBox(self) btn_add = wx.Button(self, label="&Add") btn_remove = wx.Button(self, label="&Remove") btn_clear = wx.Button(self, label="&Clear") self.log = wx.TextCtrl(self, style=wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_DONTWRAP) btnsizer = wx.BoxSizer(wx.HORIZONTAL) btnsizer.AddStretchSpacer() btnsizer.Add(btn_add, 0, wx.ALL, 5) btnsizer.Add(btn_remove, 0, wx.RIGHT | wx.TOP | wx.BOTTOM, 5) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(wx.StaticText(self, label="Directories to monitor:"), 0, wx.LEFT | wx.RIGHT | wx.TOP, 5) sizer.Add(self.list, 1, wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, 5) sizer.Add(btnsizer, 0, wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, 5) sizer.Add(wx.StaticText(self, label="Monitor log:"), 0, wx.LEFT | wx.RIGHT, 5) sizer.Add(self.log, 2, wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, 5) sizer.Add(btn_clear, 0, wx.ALIGN_RIGHT | wx.LEFT | wx.RIGHT | wx.BOTTOM, 5) self.SetSizer(sizer) self.Bind(wx.EVT_CLOSE, self.OnClose) self.Bind(wx.EVT_BUTTON, self.OnAdd, btn_add) self.Bind(wx.EVT_BUTTON, self.OnRemove, btn_remove) self.Bind(wx.EVT_BUTTON, self.OnClear, btn_clear) self.monitor = FSMonitorThread( callback=lambda event: wx.CallAfter(self.OnFSEvent, event)) def OnClose(self, evt): self.Hide() self.monitor.stop() self.Destroy() def AddPath(self, path): try: watch = self.monitor.add_dir_watch(path) except OSError as e: dlg = wx.MessageDialog(self, str(e), "Error", wx.OK | wx.ICON_ERROR) dlg.ShowModal() dlg.Destroy() else: self.list.Append(path, watch) def OnAdd(self, evt): dlg = wx.DirDialog(self) try: if dlg.ShowModal() == wx.ID_OK: self.AddPath(dlg.GetPath()) finally: dlg.Destroy() def OnRemove(self, evt): selection = self.list.GetSelection() if selection != wx.NOT_FOUND: watch = self.list.GetClientData(selection) self.monitor.remove_watch(watch) self.list.Delete(selection) def OnClear(self, evt): self.log.Clear() def OnFSEvent(self, evt): path = os.path.join(evt.watch.path, evt.name) message = "%s %s\n" % (evt.action_name, path) self.log.AppendText(message)