如何使用Python监控目录中的更改以及电子邮件通知

2024-04-19 13:06:21 发布

您现在位置:Python中文网/ 问答频道 /正文

前言:这是我关于堆栈溢出的第一篇文章,所以请原谅我在任何时候都没有遵循正确的惯例,如何正确地向社区提出问题/链接到我收到指导的其他堆栈溢出文章

我被分配了一个工作项目,其中需要监控目录的任何更改,一旦发生操作,将生成一封电子邮件并发送给管理目录的相关方

利用Tim Golden's Python Stuff: Watch a Directory for Changes(稍加修改)和一篇题为How to Get the Last Modified Date of a File in Python的帖子,我已经能够利用Python拼凑出一些代码来持续监视目录,并成功地返回发生的操作,其中带有上次修改目录时的相应时间戳(时间戳没有细化到能够捕捉每个动作的准确时间,而是将文件夹中最后一个动作的时间归因于所有不理想的动作)

关于如何在任何操作发生时处理触发自动电子邮件通知(利用MS outlook)的下一步操作,我被卡住了

我一直在浏览该网站,并看到可能的解决方案,即:Email notification on file change in particular directory with Python然而,我希望有一个解决方案可以与我现有的代码一起工作

如有任何见解、建议或指导,将不胜感激。提前感谢

以下是我目前的情况:

 import os

    import win32file
    import win32con

    from datetime import datetime

    lastmodified= os.stat("generic path of directory").st_mtime

    timestamp = (datetime.fromtimestamp(lastmodified))

    ACTIONS = {
      1 : "FILE_ACTION_ADDED",
      2 : "FILE_ACTION_REMOVED",
      3 : "FILE_ACTION_MODIFIED",
      4 : "FILE_ACTION_RENAMED_OLD_NAME",
      5 : "FILE_ACTION_RENAMED_NEW_NAME",
      8 : "FILE_NOTIFY_CHANGE_SIZE",
      10 : "FILE_NOTIFY_CHANGE_LAST_WRITE",
      20 : "FILE_NOTIFY_CHANGE_CREATION",
      40 : "FILE_NOTIFY_CHANGE_CREATION",
      100 : "FILE_NOTIFY_CHANGE_SECURITY"
    }
    # Thanks to Claudio Grondi for the correct set of numbers
    FILE_LIST_DIRECTORY = 0x0001

    path_to_watch = "generic path of directory"
    hDir = win32file.CreateFile (
      path_to_watch,
      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
    )
    while 1:
      #
      # ReadDirectoryChangesW takes a previously-created
      # handle to a directory, a buffer size for results,
      # a flag to indicate whether to watch subtrees and
      # a filter of what changes to notify.
      #
      # NB Tim Juchcinski reports that he needed to up
      # the buffer size to be sure of picking up all
      # events when a large number of files were
      # deleted at once.
      #
      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
    )
      for action, file in results:
        full_filename = os.path.join (path_to_watch, file)
        print (full_filename, ACTIONS.get (action, "Unknown"),timestamp)

Tags: oftopathnameimport目录for时间