Tcl / Tk:为什么inotify会忽略文件?

时间:2015-08-21 08:13:24

标签: tcl tk inotify

我想在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 {}}

1 个答案:

答案 0 :(得分:0)

文档(tcl-inotify.sourceforge.net)表示“i”标志表示“手表已自动删除,因为文件已被删除或其文件系统已卸载。”我查找了用于修改文件的kwrite,并在保存时创建了备份。这通常通过有效地将旧文件重命名为.backup并在保存时创建新文件来实现。

如果这就是kwrite的方式,那么inotify正常运行 - 每次保存文件时,你都会创建一个新文件并删除旧文件,并禁用当前的手表。为了测试它,我通过对文件执行一个简单的touch来“修改”该文件,看看它是否按预期工作。

如果最终出现这种情况,并且您仍希望处理程序对使用kwrite修改过的文件进行操作,那么您将需要使用IN_ONESHOT选项设置处理程序以在触发器上完全删除自身,然后让它在退出之前在同名的新文件上设置一个新手表。