我正在使用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