繁体   English   中英

使用pyinotify来监视文件创建,但等待它完全写入磁盘

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM