PyGTK/GIO:以递归方式监视更改目录

2024-10-01 11:33:07 发布

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

下面的演示代码(从GIO answer到这个问题),它使用GIO FileMonitor监视目录中的更改:

import gio

def directory_changed(monitor, file1, file2, evt_type):
    print "Changed:", file1, file2, evt_type

gfile = gio.File(".")
monitor = gfile.monitor_directory(gio.FILE_MONITOR_NONE, None)
monitor.connect("changed", directory_changed) 

import glib
ml = glib.MainLoop()
ml.run()

运行此代码后,我可以创建和修改子节点,并收到更改通知。然而,这只适用于直系子女(我知道医生没有说其他)。以下最后一个shell命令不会导致通知:

^{pr2}$

有没有一种简单的方法使它递归?我不想手动编写一些代码来创建目录、添加监视器、删除时删除它们等等

其预期用途是VCS文件浏览器扩展,能够在工作副本中缓存文件的状态,并在更改时单独更新它们。因此,可能会有成千上万个(或更多)目录需要监视。我只想找到工作副本的根目录并在那里添加文件监视器。在

我知道pyinotify,但我避免了它,这样就可以在非Linux内核,如FreeBSD或。。。其他。据我所知,GIO FileMonitor在可用的情况下使用inotify,我可以理解不强调实现来维护某种程度的抽象,但它建议我应该可以这样做。在

(如果有关系,我最初是在PyGTK mailing list上发布的。)


Tags: 文件代码import目录typefile1directorymonitor
2条回答

我不确定GIO是否允许您同时拥有多个监视器,但如果允许,您就没有理由不能这样做:

import gio
import os

def directory_changed(monitor, file1, file2, evt_type):
    if os.path.isdir(file2):    #maybe this needs to be file1?
        add_monitor(file2) 
    print "Changed:", file1, file2, evt_type

def add_monitor(dir):
    gfile = gio.File(dir)
    monitor = gfile.monitor_directory(gio.FILE_MONITOR_NONE, None)
    monitor.connect("changed", directory_changed) 

add_monitor('.')

import glib
ml = glib.MainLoop()
ml.run()

*当我说“没有理由”时,这有可能成为一个资源消耗者,尽管对GIO的了解几乎为零,但我不能说。在Python中,您完全可以使用几个命令(os.listdir)来完成自己的任务。可能看起来像这样

^{pr2}$

"Is there an easy way to make it recursive?"

我不知道有什么“简单的方法”来实现这一点。底层系统,如Linux上的inotify或BSDs上的kqueue,不提供自动添加递归监视的功能。我也不知道有什么图书馆把你想要的东西放在GIO上面。在

所以你很可能得自己动手。由于这在某些角落的情况下(例如mkdir -p foo/bar/baz),我建议研究一下pynotify如何实现其auto_add功能(grep通过pynotify source)并将其移植到GIO。在

相关问题 更多 >