我正在使用pyinotify来监视文件的创建时间。当某些文件被创建时,我想移动它们。问题是,只要文件被创建(显然),我的程序即使在它完全写入磁盘之前,也会尝试将其移动。使用pyinotify监视文件创建,但等待它被完全写入磁盘
有没有办法让pyinotify等到文件完全写入磁盘之后才通知我它已经创建?或者有什么简单的方法,在我得到通知后,让python等待移动它直到完成写入?
我正在使用pyinotify来监视文件的创建时间。当某些文件被创建时,我想移动它们。问题是,只要文件被创建(显然),我的程序即使在它完全写入磁盘之前,也会尝试将其移动。使用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”。
请注意,这将捕获修改以及创建(如果您正在镜像可能需要的行为的目录)。如果您只想触发* new *文件的检测,则需要一个自定义处理程序来跟踪“IN_CREATE”事件,然后等待它们完成(也可以通过查看“IN_CLOSE_WRITE”事件)。 – TimStaley 2013-01-03 23:45:17