我想在tcl / tk中使用inotify来监控文件。当文件内容改变时,proc"说"应该执行。我的代码只适用于一次更改。如果我再次打开文件(我用kwrite打开)并更改内容,则proc不会被执行。 "观看信息"告诉我,该文件仍然被添加到实例中。 "观看阅读"显示该标志设置为i,这对我来说,实例忽略该文件。但我不知道,为什么文件被忽略,我没有删除文件或其他东西。你能回答一下,为什么文件会被忽略?
这里是带有发射的代码:
package require inotify
1.3
proc say {fd} {
puts "say hello"
}
if {[catch {set fd [inotify create "watch" "say"]} errfd]} {
puts "$errfd"
exit
}
puts $fd
7
if {[catch {watch add /home/server/Zwischenablage/pitt_an/pitt_an_dashboard.txt C} errwatch]} {
puts "$errwatch"
exit
}
watch info
/home/server/Zwischenablage/pitt_an/pitt_an_dashboard.txt 1 C
(这里我首先编辑了文件)
打个招呼
watch info
/home/server/Zwischenablage/pitt_an/pitt_an_dashboard.txt 1 C
watch read
{watchid 1 flags i cookie 0 filename {}}
答案 0 :(得分:0)
文档(tcl-inotify.sourceforge.net)表示“i”标志表示“手表已自动删除,因为文件已被删除或其文件系统已卸载。”我查找了用于修改文件的kwrite,并在保存时创建了备份。这通常通过有效地将旧文件重命名为.backup并在保存时创建新文件来实现。
如果这就是kwrite的方式,那么inotify正常运行 - 每次保存文件时,你都会创建一个新文件并删除旧文件,并禁用当前的手表。为了测试它,我通过对文件执行一个简单的touch
来“修改”该文件,看看它是否按预期工作。
如果最终出现这种情况,并且您仍希望处理程序对使用kwrite修改过的文件进行操作,那么您将需要使用IN_ONESHOT选项设置处理程序以在触发器上完全删除自身,然后让它在退出之前在同名的新文件上设置一个新手表。