monitor_file.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import os
  2. import time
  3. from threading import Timer
  4. from watchdog.observers import Observer
  5. from watchdog.events import FileSystemEventHandler
  6. from tools.logger_handle import logger
  7. class FileSaveHandler(FileSystemEventHandler):
  8. def __init__(self, serve_client):
  9. self.serve_client = serve_client
  10. self.debounce_timers = {}
  11. self.upload_cache = {} # 文件路径 → 上次上传时间戳
  12. self.debounce_delay = 5 # 延迟秒数
  13. super().__init__()
  14. def on_modified(self, event):
  15. if event.is_directory:
  16. return
  17. filepath = event.src_path
  18. ext = os.path.splitext(event.src_path)[-1]
  19. if '~$' in event.src_path:
  20. return
  21. if ext not in ['.docx', '.doc', '.ppt', '.pptx', '.xls', '.xlsx']:
  22. return
  23. def do_upload():
  24. if not os.path.exists(filepath):
  25. return
  26. mtime = os.path.getmtime(filepath)
  27. if self.upload_cache.get(filepath) == mtime:
  28. logger.debug(f"[重复上传跳过] {filepath}")
  29. return
  30. logger.info(f"[文件修改] 文件已保存: {filepath}, 执行上传操作。")
  31. res = self.serve_client.upload_file(filepath)
  32. if res:
  33. logger.info(f'文件{filepath}上传成功')
  34. else:
  35. logger.info(f'文件{filepath}上传失败')
  36. self.upload_cache[filepath] = mtime
  37. self.debounce_timers.pop(filepath, None)
  38. if filepath in self.debounce_timers:
  39. self.debounce_timers[filepath].cancel()
  40. # 创建新的延迟上传任务
  41. timer = Timer(self.debounce_delay, do_upload)
  42. self.debounce_timers[filepath] = timer
  43. timer.start()
  44. def start_watchdog(serve_client, work_path):
  45. event_handler = FileSaveHandler(serve_client)
  46. observer = Observer()
  47. observer.schedule(event_handler, work_path, recursive=True)
  48. observer.start()
  49. logger.info(f'watch dog start {serve_client}')
  50. try:
  51. while True:
  52. time.sleep(1)
  53. except KeyboardInterrupt:
  54. observer.stop()
  55. observer.join()
  56. if __name__ == '__main__':
  57. start_watchdog()
  58. # print(os.listdir('../test/'))