2012-10-10 53 views
5

我想找出一種方法來提醒python腳本文件完成複製。下面是這種情況:如何檢查一個文件在Python中完成複製的時間?

  1. 的文件夾,to_print正在觀看由腳本用os.listdir()不斷輪詢。

  2. 每次os.listdir()都會返回一個文件列表,其中存在一個以前未見過的文件,該腳本會對該文件執行一些操作,包括打開文件並操作其內容。

這是罰款時,文件很小,並複製從其原始來源的目錄中的文件被偷窺花費較少的時間比時間os.listdir()剩餘,直到下一個輪詢量。但是,如果文件被輪詢並找到,但它仍處於複製過程中,則當腳本試圖對其執行操作時,文件內容將被破壞。

相反,我希望能夠(使用os.stat或其他)知道當前正在複製文件,並等待它完成,直到我對其執行操作爲止。

我目前的想法是每次找到一個新文件時都使用os.stat(),然後等到下一次輪詢並比較自上一次輪詢後修改/創建的日期,如果它們保持不變,那麼該文件是「穩定」,否則保持投票,直到它。我不確定這會起作用,因爲我不太瞭解Linux/Unix如何更新這些值。

回答

1

由於可以在輪詢間隔內複製文件,只需在檢查新文件之前處理由最近的輪詢發現的新文件。換句話說,而不是這樣的:

while True: 
    newfiles = check_for_new_files() 
    process(newfiles) 
    time.sleep(pollinterval) 

這樣做:

newfiles = [] 

while True: 
    process(newfiles) 
    newfiles = check_for_new_files() 
    time.sleep(pollinterval) 

或者只是把等待在循環的中間(同樣的效果真的):

while True: 
    newfiles = check_for_new_files() 
    time.sleep(pollinterval) 
    process(newfiles) 
+0

如果沒有要處理的文件和目錄爲空,這是行不通的。 – emish

+0

@emish,爲什麼不呢? 'newfiles'不會是一個空列表,當然''process'可以合理地處理一個空列表。 (如果它不能,那麼它應該調整,以便它可以。) – huon

+0

@kindall我的道歉。我沒有意識到差異,直到我嘗試了它。謝謝,這正是我需要的短小黑客! – emish

2

嘗試inotify

這是一個用於觀看文件的Linux標準。對於您的使用案例,IN_CLOSE_WRITE似乎很有前途。有一個Python library for inotify。一個非常簡單的例子(取自there)。您需要修改它才能捕獲IN_CLOSE_WRITE事件。

# Example: loops monitoring events forever. 
# 
import pyinotify 

# Instanciate a new WatchManager (will be used to store watches). 

wm = pyinotify.WatchManager() 
# Associate this WatchManager with a Notifier (will be used to report and 
# process events). 

notifier = pyinotify.Notifier(wm) 
# Add a new watch on /tmp for ALL_EVENTS. 
wm.add_watch('/tmp', pyinotify.ALL_EVENTS) # <-- replace by IN_CLOSE_WRITE 

# Loop forever and handle events. 
notifier.loop() 

這是一個廣泛的API文檔:http://seb-m.github.com/pyinotify/

相關問題