[英]Using pyinotify to watch for file creation, but waiting for it to be completely written to disk
我正在使用pyinotify来查看在其中创建文件的文件夹。 当创建某些文件时,我想移动它们。 问题是,一旦创建文件(显然),我的程序就会尝试移动它,甚至在它完全写入磁盘之前。
有没有办法使pyinotify等到一个文件完全写入磁盘,然后通知我它已被创建? 还是有任何简单的方法,在我收到通知后,让python等待移动它直到它完成写入?
pyinotify对IN_CLOSE_WRITE事件做出反应:
wm.add_watch(watched_dir, pyinotify.IN_CLOSE_WRITE, proc_fun=MyProcessEvent())
这是来自man 5 incrontab
,但它同样适用于pyinotify:
IN_ACCESS File was accessed (read) (*)
IN_ATTRIB Metadata changed (permissions, timestamps, extended attributes, etc.) (*)
IN_CLOSE_WRITE File opened for writing was closed (*)
IN_CLOSE_NOWRITE File not opened for writing was closed (*)
IN_CREATE File/directory created in watched directory (*)
IN_DELETE File/directory deleted from watched directory (*)
IN_DELETE_SELF Watched file/directory was itself deleted
IN_MODIFY File was modified (*)
IN_MOVE_SELF Watched file/directory was itself moved
IN_MOVED_FROM File moved out of watched directory (*)
IN_MOVED_TO File moved into watched directory (*)
IN_OPEN File was opened (*)
如果正在写入文件,则很难在此级别告诉。 你可以做的是测试一个文件是否被其他进程打开。
1)从打开文件时使用的各种标志,O_EXLOCK标志可能会有所帮助。 如果设置了O_EXLOCK标志,则文件描述符对文件具有独占锁定。 所以我的理解是,如果你可以使用O_EXLOCK标志执行os.open(),它不会被其他进程打开。 这适用于所有posix兼容的操作系统,但我还没有测试过。 如果文件已打开,则可以关闭,等待并再次重试。
2)您也可以尝试os.stat并查看更改时间戳并尝试安全地解释信息。 虽然这不是万无一失的。
3)在unix系统上,你可以尝试“lsof”
4)以下页面描述了使用/ proc / PID / fd中的符号链接来测试打开的文件
[编辑:链接更新]
如果您可以控制写入过程,则可以在写入文件时调用文件“foo.part”,并在关闭时将其重命名为“foo”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.