下面的演示代码(从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上发布的。)
我不确定GIO是否允许您同时拥有多个监视器,但如果允许,您就没有理由不能这样做:
*当我说“没有理由”时,这有可能成为一个资源消耗者,尽管对GIO的了解几乎为零,但我不能说。在Python中,您完全可以使用几个命令(
^{pr2}$os.listdir
)来完成自己的任务。可能看起来像这样我不知道有什么“简单的方法”来实现这一点。底层系统,如Linux上的inotify或BSDs上的kqueue,不提供自动添加递归监视的功能。我也不知道有什么图书馆把你想要的东西放在GIO上面。在
所以你很可能得自己动手。由于这在某些角落的情况下(例如
mkdir -p foo/bar/baz
),我建议研究一下pynotify如何实现其auto_add
功能(grep通过pynotify source)并将其移植到GIO。在相关问题 更多 >
编程相关推荐