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

时间:2010-10-06 19:57:10

标签: python linux file pyinotify

我正在使用pyinotify来查看在其中创建文件的文件夹。当创建某些文件时,我想移动它们。问题是,一旦创建文件(显然),我的程序就会尝试移动它,甚至在它完全写入磁盘之前。

有没有办法让pyinotify等到文件完全写入磁盘,然后才通知我它已被创建?还是有任何简单的方法,在我收到通知后,让python等待移动它直到它完成写入?

3 个答案:

答案 0 :(得分:15)

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 :(得分:1)

在这个级别告诉是否正在写入文件是非常困难的。你可以做的是测试一个文件是否被其他进程打开。

1)从打开文件时使用的各种标志开始,O_EXLOCK标志可能会有所帮助。 如果设置了O_EXLOCK标志,则文件描述符对文件具有独占锁定。 所以我的理解是,如果你可以使用O_EXLOCK标志执行os.open(),它不会被其他进程打开。 这适用于所有posix兼容的操作系统,但我还没有测试过。如果该文件已打开,则您可以关闭,等待并再次重试。

2)您也可以尝试os.stat并查看更改时间戳并尝试安全地解释信息。虽然这不是万无一失的。

3) 在unix系统上,您可以尝试“lsof”

4)以下页面描述了使用/ proc / PID / fd中的符号链接来测试打开的文件

[编辑:链接已更新]

答案 2 :(得分:1)

如果您可以控制写入过程,则可以在写入文件时调用文件“foo.part”,并在文件被关闭时将其重命名为“foo”。