Python 使用pyinotify监视文件创建,但等待文件完全写入磁盘
我正在使用pyinotify监视文件夹中创建文件的时间。当创建某些文件时,我想移动它们。问题是,文件一创建(显然),我的程序就试图移动它,甚至在它完全写入磁盘之前Python 使用pyinotify监视文件创建,但等待文件完全写入磁盘,python,linux,file,pyinotify,Python,Linux,File,Pyinotify,我正在使用pyinotify监视文件夹中创建文件的时间。当创建某些文件时,我想移动它们。问题是,文件一创建(显然),我的程序就试图移动它,甚至在它完全写入磁盘之前 有没有办法让pyinotify等到文件完全写入磁盘后再通知我该文件已创建?或者,在我接到通知后,有没有什么简单的方法可以让python等到写入完成后再移动它?在这个级别很难判断文件是否正在写入。您可以做的是测试一个文件是否被其他进程打开 1) 从打开文件时使用的各种标志来看,O_EXLOCK标志可能会有所帮助。 如果设置了O_EXLO
有没有办法让pyinotify等到文件完全写入磁盘后再通知我该文件已创建?或者,在我接到通知后,有没有什么简单的方法可以让python等到写入完成后再移动它?在这个级别很难判断文件是否正在写入。您可以做的是测试一个文件是否被其他进程打开 1) 从打开文件时使用的各种标志来看,O_EXLOCK标志可能会有所帮助。 如果设置了O_EXLOCK标志,则文件描述符对文件具有独占锁。 所以我的理解是,如果您可以使用O_EXLOCK标志来执行os.open(),它就不会被其他进程打开。 这应该适用于所有posix兼容的操作系统,但我还没有测试过。如果文件已打开,则可以关闭、等待并重试 2) 您还可以尝试os.stat并查看更改的时间戳,并尝试安全地解释信息。尽管这不是傻瓜式的 (三) 在unix系统上,可以尝试“lsof” 4) 下页介绍如何使用/proc/PID/fd中的符号链接测试打开的文件
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 (*)
如果您可以控制写入过程,则可以在写入文件时调用文件“foo.part”,并在文件关闭时将其重命名为“foo”。注意,这将捕获修改和创建(如果您正在镜像可能需要的目录行为)。如果您只想在检测到新文件时触发,则需要一个自定义处理程序,该处理程序在\u CREATE事件中跟踪
,然后等待事件完成(同时通过查看IN\u CLOSE\u WRITE
事件)。如何获取文件名?@NPE:使用process\u IN\u CLOSE\u WRITE
方法将MyProcessEvent
定义为pyinotify.ProcessEvent
的子类。当发生CLOSE\u WRITE事件时,将使用参数event
调用\u CLOSE\u WRITE
中的进程<代码>事件。路径名
是指向已关闭文件的路径。请参阅。@unutbu很好的解释,如何获取文件名?@NPE:您可以使用。
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 (*)