2010-10-06 45 views
7

我正在使用pyinotify来监视文件的创建时间。当某些文件被创建时,我想移动它们。问题是,只要文件被创建(显然),我的程序即使在它完全写入磁盘之前,也会尝试将其移动。使用pyinotify监视文件创建,但等待它被完全写入磁盘

有没有办法让pyinotify等到文件完全写入磁盘之后才通知我它已经创建?或者有什么简单的方法,在我得到通知后,让python等待移动它直到完成写入?

回答

14

有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

请注意,这将捕获修改以及创建(如果您正在镜像可能需要的行为的目录)。如果您只想触发* new *文件的检测,则需要一个自定义处理程序来跟踪“IN_CREATE”事件,然后等待它们完成(也可以通过查看“IN_CLOSE_WRITE”事件)。 – TimStaley 2013-01-03 23:45:17

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”。