Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Main.py:
- import win32file, win32con, time, sys, os, re, threading, FileSystemWatcher, shutil, hashlib
- global WatchedPath
- WatchedPath = "Z:\\"
- global changes
- changes = []
- global processLocked
- processLocked = False
- global datapath
- datapath = "D:\\DATA_test\\"
- global blacklist
- blacklist = []
- class Startup():
- def __init__(self):
- Main()
- class Main():
- def __init__(self):
- Main.watcherloop(self, WatchedPath)
- def watcherloop(self, path, index=0):
- global processLocked
- changes.append([])
- while True:
- changes[index] = FileSystemWatcher.FileSystemWatcher.windows_watch_path(self, path)
- if len(changes[index]) > 0 and not processLocked:
- processLocked = True
- #print("Changes" + str(index) + ": " + str(changes[index][0]))
- Main.FileHandler(self, changes[index][0])
- del changes[index][0]
- processLocked = False
- def FileHandler(self, file):
- # File:
- # 0 = Path, 1 = File, 3 = Action
- if str(file[1]).endswith(".bak"):
- return
- #print("Handling: " + str(file))
- if file[2] == 1:
- #file created
- Main.getFile(self, file[0],file[1])
- elif file[2] == 2:
- #file deleted
- Main.deleteFile(self, file[1])
- print("Deleted " + str(file[1]))
- elif file[2] == 3:
- #file updated
- Main.getFile(self, file[0],file[1])
- elif file[2] == 4:
- #renamed
- pass
- elif file[2] == 5:
- #renamed
- pass
- else:
- print("Unexpected FileEvent")
- return
- def getFile(self, remotename, filename):
- if os.path.isfile(os.path.join(datapath, filename)):
- if Main.createmd5(self, os.path.join(remotename, filename)) == Main.createmd5(self, os.path.join(datapath, filename)):
- return
- try:
- shutil.copyfile(os.path.join(remotename, filename), os.path.join(datapath, filename))
- print("Downloaded " + str(filename))
- except PermissionError:
- print("Permission denied while copying " + str(remotename))
- return
- def deleteFile(self, filename):
- if os.path.isfile(os.path.join(datapath, str(filename))):
- os.remove(os.path.join(datapath, str(filename)))
- return
- def createmd5(self, filePath):
- fh = open(filePath, "rb")
- m = hashlib.md5()
- while True:
- data = fh.read(8192)
- if not data:
- break
- m.update(data)
- return m.hexdigest()
- if __name__ == "__main__":
- Startup()
- FileSystemWatcher.py:
- import win32file, win32con
- class FileSystemWatcher(object):
- def windows_watch_path(self, watched_path):
- ACTIONS = {
- 1 : 1,#"Created",
- 2 : 2,#"Deleted",
- 3 : 3,#"Updated",
- 4 : 4,#"RenamedFrom",
- 5 : 5#"RenamedTo"
- }
- # Thanks to Claudio Grondi for the correct set of numbers
- FILE_LIST_DIRECTORY = 0x0001
- try:
- hDir = win32file.CreateFile (
- watched_path
- , FILE_LIST_DIRECTORY
- , win32con.FILE_SHARE_READ |
- win32con.FILE_SHARE_WRITE |
- win32con.FILE_SHARE_DELETE
- , None
- , win32con.OPEN_EXISTING
- , win32con.FILE_FLAG_BACKUP_SEMANTICS
- , None
- )
- except:
- # either it does not exist by this time, or some other issue... blah.
- # we'll just say "it 'changed' from 'some other expected state'"
- return [[watched_path, '', ACTIONS[2]]]
- results = win32file.ReadDirectoryChangesW (
- hDir,
- 1024,
- True,
- 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,
- None,
- None
- )
- files_changed = []
- for action, fn in results:
- files_changed.append(
- [
- watched_path
- , fn
- , ACTIONS[action]
- ]
- )
- # print fullfn, ACTIONS.get(action, "Unknown")
- return files_changed
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement