2010-10-06 50 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」。