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

Python 使用pyinotify监视文件创建,但等待文件完全写入磁盘,python,linux,file,pyinotify,Python,Linux,File,Pyinotify,我正在使用pyinotify监视文件夹中创建文件的时间。当创建某些文件时,我想移动它们。问题是,文件一创建(显然),我的程序就试图移动它,甚至在它完全写入磁盘之前 有没有办法让pyinotify等到文件完全写入磁盘后再通知我该文件已创建?或者,在我接到通知后,有没有什么简单的方法可以让python等到写入完成后再移动它?在这个级别很难判断文件是否正在写入。您可以做的是测试一个文件是否被其他进程打开 1) 从打开文件时使用的各种标志来看,O_EXLOCK标志可能会有所帮助。 如果设置了O_EXLO

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


有没有办法让pyinotify等到文件完全写入磁盘后再通知我该文件已创建?或者,在我接到通知后,有没有什么简单的方法可以让python等到写入完成后再移动它?

在这个级别很难判断文件是否正在写入。您可以做的是测试一个文件是否被其他进程打开

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

2) 您还可以尝试os.stat并查看更改的时间戳,并尝试安全地解释信息。尽管这不是傻瓜式的

(三) 在unix系统上,可以尝试“lsof”

4) 下页介绍如何使用/proc/PID/fd中的符号链接测试打开的文件

[编辑:更新链接]

让pyinotify对事件作出反应:

这来自于
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 (*)