[英]Using pyinotify to watch for file creation, but waiting for it to be completely written to disk
我正在使用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”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.