user2877960
user2877960

Reputation: 23

File monitoring in osx 10.8.2 using python

I am using a file monitor to listen to the changes in a file using win32file monitor. This below code works fine on windows. This code does not work on mac osx. Any suggestions for making a file monitor on mac osx.

thread1 = myThread(1, tempFileName, tempLocation,selectedFileName)
thread1.start();    

    class myThread (threading.Thread):
                def __init__(self, threadID, fileName, directory, origin):
                    threading.Thread.__init__(self)
                    self.threadID = threadID
                    self.fileName = fileName
                    self.daemon = True
                    self.dir = directory
                    self.originalFile = origin
                def run(self):
                    startMonitor(self.fileName, self.dir, self.originalFile)

    def startMonitor(fileMonitoring,dirPath,originalFile):
                    hDir = win32file.CreateFile (
                      dirPath,
                      FILE_LIST_DIRECTORY,
                      win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE,
                      None,
                      win32con.OPEN_EXISTING,
                      win32con.FILE_FLAG_BACKUP_SEMANTICS,
                      None
                    )
                    readFlags = win32con.FILE_NOTIFY_CHANGE_FILE_NAME  | \
                            win32con.FILE_NOTIFY_CHANGE_DIR_NAME   | \
                            win32con.FILE_NOTIFY_CHANGE_ATTRIBUTES | \
                            win32con.FILE_NOTIFY_CHANGE_SIZE       | \
                            win32con.FILE_NOTIFY_CHANGE_LAST_WRITE | \
                            win32con.FILE_NOTIFY_CHANGE_SECURITY
                    # Wait for new data and call ProcessNewData for each new chunk that's    written
                    while 1:
                        # Wait for a change to occur
                        results = win32file.ReadDirectoryChangesW (
                                                                   hDir,
                                                                   1024,
                                                                   False,
                                                                   readFlags,
                                                                   None
                                                                   )
                        # For each change, check to see if it's updating the file we're interested in
                        for action, file_M in results:
                            full_filename = os.path.join (dirPath, file_M)
                            #print file, ACTIONS.get (action, "Unknown")
                            if len(full_filename) == len(fileMonitoring) and action == 3:
                                if os.path.exists(originalFile):
                                        encrypt_file(fileMonitoring,originalFile)

Upvotes: 0

Views: 240

Answers (2)

imp
imp

Reputation: 2087

You can use this. It works in my case.

class ChangeHandler(FileSystemEventHandler):

        def on_any_event(self, event):
            encrypt_file(key, tempFileName, selectedFileName,iv)

    def filemonitor(tempFileName,tempLocation):

        while 1:

            event_handler = ChangeHandler()
            observer = Observer()
            observer.schedule(event_handler, tempLocation, recursive=True)
            observer.start()
            try:
                while True:
                    time.sleep(1)
            except KeyboardInterrupt:
                observer.stop()
            observer.join()        

    Thread(target=filemonitor,args=(tempFileName,tempLocation,)).start()

Upvotes: 0

falsetru
falsetru

Reputation: 369354

pywin32 (Python extensions for Windows) only works on Windows as the name suggests.

You can use watchdog. It support Mac OS X as well as Linux, Windows, FreeBSD.

Upvotes: 1

Related Questions