簡體   English   中英

使用pyinotify來監視文件創建,但等待它完全寫入磁盤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM