gpt4 book ai didi

python - 如何在python中获取文件关闭事件

转载 作者:太空狗 更新时间:2023-10-29 20:38:01 25 4
gpt4 key购买 nike

在 Windows 7 64 位机器上使用 python 2.7。

如何获取文件关闭事件:

  • 当文件在文件打开器的新进程中打开时(如记事本、写字板,每次都在写字板的新进程中打开文件)
  • 当文件在文件打开器的选项卡中打开时(如 Notepad++ ,它在新选项卡中打开所有文件,但只有一个 Notepad++ 正在运行)

  • 那么,在上述情况下如何获取文件关闭事件?是否可以通过通用代码实现上述情况?我正在处理不同的文件类型

    最佳答案

    事实证明,这对于 *nix 系统来说是一项非常简单的任务,但在 Windows 上,获取文件关闭事件并不是一项简单的任务。阅读下面按操作系统分组的常用方法的摘要。

    对于 Linux

    在 Linux 上,可以轻松监控文件系统更改,并且非常详细。最好的工具是名为 inotify 的内核特性。 ,并且有一个使用它的 Python 实现,称为 Pynotify。

  • Pyinotify
    Pyinotify是一个用于监视文件系统更改的 Python 模块。 Pyinotify 依赖于一个名为 inotify 的 Linux 内核功能(在内核 2.6.13 中合并)。 ,这是一个事件驱动的通知程序。它的通知通过三个系统调用从内核空间导出到用户空间。 Pyinotify绑定(bind)这些系统调用并在它们之上提供一个实现,提供一种通用和抽象的方法来操作这些功能。

    Here您可以使用 Pynotify 找到可以监控的事件列表。 .

    用法示例:

    导入pyinotify
    class EventHandler(pyinotify.ProcessEvent):
    def process_IN_CLOSE_NOWRITE(self, event):
    print "File was closed without writing: " + event.pathname
    def process_IN_CLOSE_WRITE(self, event):
    print "File was closed with writing: " + event.pathname

    def watch(filename):
    wm = pyinotify.WatchManager()
    mask = pyinotify.IN_CLOSE_NOWRITE | pyinotify.IN_CLOSE_WRITE
    wm.add_watch(filename, mask)

    eh = EventHandler()
    notifier = pyinotify.Notifier(wm, eh)
    notifier.loop()

    if __name__ == '__main__':
    watch('/path/to/file')

  • 对于 Windows

    Windows 的情况比 Linux 复杂得多。大多数图书馆依赖于 ReadDirectoryChanges API 受限制,无法检测文件关闭事件等更精细的细节。然而,还有其他方法可以检测此类事件,因此请继续阅读以了解更多信息。
  • Watcher

    注: Watcher 上次更新是在 2011 年 2 月,所以跳过这个可能是安全的。
    Watcher是低级 C使用 ReadDirectoryChangesW 接收文件系统更新的扩展名Windows 系统上的 API。该软件包还包括一个高级接口(interface)来模拟大部分 .NET FileSystemWatcher应用程序接口(interface)。
    使用 Watcher 检测文件关闭事件最接近的方法是监视 FILE_NOTIFY_CHANGE_LAST_WRITE和/或 FILE_NOTIFY_CHANGE_LAST_ACCESS事件。

    用法示例:
    import watcher
    w = watcher.Watcher(dir, callback)
    w.flags = watcher.FILE_NOTIFY_CHANGE_LAST_WRITE
    w.start()
  • Watchdog

    用于监视文件系统事件的 Python API 和 shell 实用程序。轻松安装:$ pip install watchdog .更多信息请访问 documentation .
    Windows 上的看门狗依赖于 ReadDirectoryChangesW API,它带来了与 Watcher 和其他依赖相同 API 的库一样的警告。
  • Pywatch

    一个接近克隆 Linux 的 python watch命令。 pywatch.watcher.Watcher class 可以被告知观察一组文件,并在任何这些文件发生变化时给出一组命令来运行。它只能监视文件更改事件,因为它依赖于轮询 stat's st_mtime .

  • 带有 NTFS 的 Windows 的奖励:
  • NTFS USN Journal

    NTFS USN(更新序列号)日志是 NTFS 的一项功能,它维护对卷所做更改的记录。它被列为 Bonus 的原因是因为与其他条目不同,它不是特定的库,而是 NTFS 系统上存在的功能。因此,如果您使用其他 Windows 文件系统(如 FAT、ReFS 等),则这不适用。
    它的工作方式是系统记录对 USN 日志文件中的卷所做的所有更改,每个卷都有自己的实例。更改日志中的每条记录都包含 USN、文件名以及有关更改内容的信息。

    该方法对这个问题感兴趣的主要原因是,与大多数其他方法不同,该方法提供了一种检测 的方法。文件关闭 事件,定义为 USN_REASON_CLOSE .可以在此 MSDN article 中找到包含完整事件列表的更多信息.有关 USN Journaling 的完整文档,请访问此 MSDN page .

    有多种方法可以从 Python 访问 USN Journal,但唯一成熟的选择似乎是 ntfsjournal 模块。

  • Windows 的“正确”方式:
  • File system filter driver

    MSDN page 上所述:

    A file system filter driver is an optional driver that adds value to or modifies the behavior of a file system. A file system filter driver is a kernel-mode component that runs as part of the Windows executive. A file system filter driver can filter I/O operations for one or more file systems or file system volumes. Depending on the nature of the driver, filter can mean log, observe, modify, or even prevent. Typical applications for file system filter drivers include antivirus utilities, encryption programs, and hierarchical storage management systems.



    实现一个文件系统过滤驱动并不是一件容易的事,但是对于想尝试的人来说,CodeProject上有一个很好的介绍教程。 .

    附言查询 @ixe013's answer有关此方法的一些其他信息。

  • 多平台
  • Qt's QFileSystemWatcher
    QFileSystemWatcher类提供了一个接口(interface)来监视文件和目录的修改。这个类是在 Qt 4.2 中引入的.
    不幸的是,它的功能相当有限,因为它只能检测文件何时被修改、重命名或删除,以及何时将新文件添加到目录中。

    用法示例:
    import sys
    from PyQt4 import QtCore

    def directory_changed(path):
    print('Directory Changed: %s' % path)

    def file_changed(path):
    print('File Changed: %s' % path)

    app = QtCore.QCoreApplication(sys.argv)

    paths = ['/path/to/file']
    fs_watcher = QtCore.QFileSystemWatcher(paths)
    fs_watcher.directoryChanged.connect(directory_changed)
    fs_watcher.fileChanged.connect(file_changed)

    app.exec_()
  • 关于python - 如何在python中获取文件关闭事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22406309/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com