使用pyinotify监控文件创建,但等待文件完全写入磁盘
我正在使用pyinotify来监控一个文件夹,想要在里面创建文件时得到通知。当某些文件被创建时,我想把它们移动到其他地方。问题是,一旦文件被创建(这很明显),我的程序就会尝试移动它,甚至在文件还没有完全写入磁盘之前。
有没有办法让pyinotify等到文件完全写入磁盘后再通知我它被创建了?或者有没有简单的方法,在我收到通知后,让Python等到文件写入完成再进行移动?
3 个回答
1
在这个层面上,很难判断一个文件是否正在被写入。你可以做的是测试一下这个文件是否被其他进程打开。
1) 在打开文件时,有很多不同的标志,其中 O_EXLOCK 标志可能会有帮助。如果设置了 O_EXLOCK 标志,文件描述符就会对这个文件有独占锁。我的理解是,如果你可以使用 O_EXLOCK 标志调用 os.open(),那么这个文件就没有被其他进程打开。这应该适用于所有兼容 POSIX 的操作系统,但我还没有测试过。如果文件已经打开,你可以选择关闭它、等待一会儿,然后再试一次。
2) 你也可以尝试使用 os.stat 来查看文件的修改时间戳,并尝试安全地解读这些信息。不过,这种方法并不是万无一失的。
3) 在 Unix 系统上,你可以尝试使用 "lsof" 命令。
4) 以下页面描述了如何使用 /proc/PID/fd 中的符号链接来测试打开的文件。
[编辑:链接已更新]
1
如果你能控制文件的写入过程,可以在写文件的时候把它命名为“foo.part”,等写完后再把它改成“foo”。
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 (*)