imp*_*imp 8 python windows file process file-monitoring
在Windows 7 64位机器上使用python 2.7.
如何获取文件关闭事件:
那么,如何在上述情况下获取文件关闭事件?是否可以通过公共代码实现上述情况?我正在处理不同的文件类型
bos*_*jak 17
事实证明这对于*nix系统来说是一项非常简单的任务,但在Windows上,获取文件关闭事件并不是一项简单的任务.请阅读以下按OS分组的常用方法摘要.
在Linux上,可以轻松监视文件系统更改,并且非常详细.最好的工具是调用的内核功能inotify,并且有一个使用它的Python实现,称为Pynotify.
Pyinotify是一个用于监视文件系统更改的Python模块.Pyinotify依赖于一个名为Linux内核的功能(在内核2.6.13中合并)inotify,这是一个事件驱动的通知程序.其通知通过三个系统调用从内核空间导出到用户空间.Pyinotify绑定这些系统调用并在它们之上提供实现,提供操作这些功能的通用和抽象方法.
在这里,您可以找到可以监控的事件列表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')
Run Code Online (Sandbox Code Playgroud)Windows的情况比Linux复杂得多.大多数库依赖于ReadDirectoryChanges受限制的API,并且无法检测文件关闭事件等更精细的细节.然而,还有其他方法可以检测此类事件,因此请继续阅读以了解更多信息.
注意: Watcher最后一次更新是在2011年2月,所以跳过这个可能是安全的.
Watcher是一个低级C扩展,用于ReadDirectoryChangesW在Windows系统上使用API 接收文件系统更新.该软件包还包括一个高级接口,用于模拟大多数.NET FileSystemWatcherAPI.
最近的人可以通过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()
Run Code Online (Sandbox Code Playgroud)用于监视文件系统事件的Python API和shell实用程序.易于安装:$ pip install watchdog.有关更多信息,请访问文档.
Windows上的Watchdog依赖于ReadDirectoryChangesWAPI,这与Watcher和依赖相同API的其他库一样带来了警告.
Linux watch命令的python near-clone .该pywatch.watcher.Watcher班可以告诉观看一组文件,并给定一组命令来运行,只要其中任何文件的改变.它只能监视文件更改事件,因为它依赖于轮询stat的st_mtime.
NTFS USN(更新序列号)日志是NTFS的一项功能,它保留对卷所做更改的记录.它被列为奖金的原因是因为与其他条目不同,它不是特定的库,而是NTFS系统上存在的特征.因此,如果您正在使用其他Windows文件系统(如FAT,ReFS等),则不适用.
它的工作方式是系统记录USN Journal文件中对卷所做的所有更改,每个卷都有自己的实例."更改日志"中的每条记录都包含USN,文件名以及有关更改内容的信息.
此方法对此问题感兴趣的主要原因是,与大多数其他方法不同,此方法提供了一种检测文件关闭事件的方法,定义为USN_REASON_CLOSE.有关完整事件列表的更多信息,请参阅此MSDN文章.有关USN日记的完整文档,请访问此MSDN页面.
从Python访问USN Journal有多种方法,但唯一成熟的选项似乎是ntfsjournal模块.
正如在MSDN页面上所描述的那样:
文件系统筛选器驱动程序是一个可选驱动程序,可为文件系统的行为增加值或修改其行为.文件系统筛选器驱动程序是内核模式组件,作为Windows执行程序的一部分运行.文件系统筛选器驱动程序可以筛选一个或多个文件系统或文件系统卷的I/O操作.根据驱动程序的性质,过滤器可能意味着记录,观察,修改甚至阻止.文件系统筛选器驱动程序的典型应用程序包括防病毒实用程序,加密程序和分层存储管理系统.
实现文件系统过滤器驱动程序并不是一件容易的事,但对于想尝试一下的人来说,有一个很好的CodeProject介绍教程.
PS检查 @ ixe013的答案,了解有关此方法的一些其他信息.
本QFileSystemWatcher类提供用于监控文件和目录进行修改的接口.这个课程是在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_()
Run Code Online (Sandbox Code Playgroud)