12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- import os
- import time
- from threading import Timer
- from watchdog.observers import Observer
- from watchdog.events import FileSystemEventHandler
- from tools.logger_handle import logger
- class FileSaveHandler(FileSystemEventHandler):
- def __init__(self, serve_client):
- self.serve_client = serve_client
- self.debounce_timers = {}
- self.upload_cache = {} # 文件路径 → 上次上传时间戳
- self.debounce_delay = 5 # 延迟秒数
- super().__init__()
- def on_modified(self, event):
- if event.is_directory:
- return
- filepath = event.src_path
- ext = os.path.splitext(event.src_path)[-1]
- if '~$' in event.src_path:
- return
- if ext not in ['.docx', '.doc', '.ppt', '.pptx', '.xls', '.xlsx']:
- return
- def do_upload():
- if not os.path.exists(filepath):
- return
- mtime = os.path.getmtime(filepath)
- if self.upload_cache.get(filepath) == mtime:
- logger.debug(f"[重复上传跳过] {filepath}")
- return
- logger.info(f"[文件修改] 文件已保存: {filepath}, 执行上传操作。")
- res = self.serve_client.upload_file(filepath)
- if res:
- logger.info(f'文件{filepath}上传成功')
- else:
- logger.info(f'文件{filepath}上传失败')
- self.upload_cache[filepath] = mtime
- self.debounce_timers.pop(filepath, None)
- if filepath in self.debounce_timers:
- self.debounce_timers[filepath].cancel()
- # 创建新的延迟上传任务
- timer = Timer(self.debounce_delay, do_upload)
- self.debounce_timers[filepath] = timer
- timer.start()
- def start_watchdog(serve_client, work_path):
- event_handler = FileSaveHandler(serve_client)
- observer = Observer()
- observer.schedule(event_handler, work_path, recursive=True)
- observer.start()
- logger.info(f'watch dog start {serve_client}')
- try:
- while True:
- time.sleep(1)
- except KeyboardInterrupt:
- observer.stop()
- observer.join()
- if __name__ == '__main__':
- start_watchdog()
- # print(os.listdir('../test/'))
|