コード例 #1
0
ファイル: test.py プロジェクト: buriy/fsmonitor
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
コード例 #2
0
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
コード例 #3
0
ファイル: monitor.py プロジェクト: osa1/amele
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()
コード例 #4
0
ファイル: wxdemo.py プロジェクト: jason-s/fsmonitor
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)
コード例 #5
0
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)