我正在使用pyinotify来查看在其中创建文件的文件夹。当创建某些文件时,我想移动它们。问题是,一旦创建文件(显然),我的程序就会尝试移动它,甚至在它完全写入磁盘之前。
有没有办法让pyinotify等到文件完全写入磁盘,然后才通知我它已被创建?还是有任何简单的方法,在我收到通知后,让python等待移动它直到它完成写入?
答案 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”。