在没有轮询的情况下检测文件更改

时间:2011-04-21 01:12:49

标签: python

我正在尝试使用Python程序中的方法来检测文件系统上的文件是否已被修改。我知道我可以在每5秒钟运行一次以检查系统的最后修改日期,但我很好奇是否有更简单的方法来执行此操作,而无需要求我的程序重复检查

有谁知道这种方法?

4 个答案:

答案 0 :(得分:77)

watchdog

用于观看目录的优秀跨平台库。

来自网站

  

支持的平台

     
      
  • Linux 2.6(inotify)

  •   
  • Mac OS X(FSEvents,kqueue)

  •   
  • FreeBSD / BSD(kqueue)

  •   
  • Windows(带有I / O完成端口的ReadDirectoryChangesW; ReadDirectoryChangesW工作线程)

  •   
  • 独立于操作系统(轮询磁盘以查找目录快照并定期进行比较;慢速且不推荐)

  •   

我已经在几个项目中使用它,它似乎工作得非常好。

答案 1 :(得分:43)

对于linux,有pyinotify

从主页:

  

Pyinotify是一个Python模块   监视文件系统的变化。   Pyinotify依赖于Linux内核   功能(在内核2.6.13中合并)   叫inotify。 inotify是一个   事件驱动的通知器,它的   通知从内核导出   通过三个空间到用户空间   系统调用。 pyinotify结合这些   系统调用并提供   在他们提供的基础上实施   一种通用和抽象的方式   操纵这些功能。

因此,它显然不是跨平台的,而是依赖于足够新的内核版本。但是,据我所知,任何非轮询机制都需要内核支持。

答案 2 :(得分:6)

在Windows上有:

watcher,这是.NET FileSystemWatcher API的一个很好的python端口。

还有(我写的那个)dirwatch

两者都依赖于Windows ReadDirectoryChangesW功能。虽然对于实际工作,我会使用watcher(适当的C扩展,良好的API,python 2& 3支持)。

我的主要是在Windows上调用相关API的实验,所以如果你想要一个从python调用这些东西的例子,这很有趣。

答案 3 :(得分:4)

您还应该看到inotifyx与前面提到的pyinotify非常相似,但据说其API变化较小。