2010-08-03 30 views
0

我試圖獲取以下代碼來觀察文件夾的更改並返回文件名(最好是完整路徑)作爲字符串一旦檢查到文件大小最近沒有增加,以阻止我的腳本的其餘部分檢查不完整的文件。 我很難發送我的文件大小定時器功能的文件名,因爲我收集檢測到的文件列表。 如果我吠叫錯了樹,請隨時告訴我,並感謝您的幫助!Python Watch文件夾 - 文件大小的詢問列表

斯圖爾特

import os, time 

def watch(path_to_watch): 
    before = dict ([(f, None) for f in os.listdir (path_to_watch)]) 
    while watch_active == 1: 
     time.sleep (10) 
     after = dict ([(f, None) for f in os.listdir (path_to_watch)]) 
     added = [f for f in after if not f in before] 
     removed = [f for f in before if not f in after] 
     if added: 
      filesizechecker(added) 
      return added 
     if removed: 
      print "Removed: ", ", ".join (removed) 
     before = after 

def filesizechecker(filepath): 
# Checks filesize of input file and 
# returns 1 when file hasn't changed for 3 seconds 
    fnow = open(filepath, "rb") 
    fthen = 1 
    while fnow != fthen: 
     time.sleep(3) 
     fthen = len(f.read()) 

watch_active = 1 
watch("/home/stewart/Documents") 
+0

您確定這是測試文件不是「正在進行」的最佳方法嗎?例如,你可以在臨時目錄中處理不完整的文件,然後將'os.rename'(這是原子的)處理到主目錄中。 – katrielalex 2010-08-03 14:34:16

+0

哦,你應該使用'set'而不是'dict';一方面,這是做事的正確方式 - 但不僅如此,你可以在'之前加'=!因此,例如'before = set(os.listdir(...))'。 – katrielalex 2010-08-03 14:36:25

回答

0

我做了一些更多的研究,發現了pyinotify中圖書館是更適合我的需要,它的UPT。

特別是IN_CLOSE_WRITE事件代碼在應用程序(在我的情況下是一個文件副本)關閉一個可寫文件時返回。

0

你也可以查看如何lsof作品。它列出了打開的文件。如果你正在觀看(或想要)的文件沒有打開,它也不太可能被改變。

您在Linux上,因此您可以隨時檢查/ proc文件系統以獲取有關進程和文件的信息。

我不知道的細節,所以啊,你經受這種思路是值得你花時間:)

+0

謝謝你的想法,extraneon。但是這些文件通常會通過其他機器上的samba/nfs/afp傳輸,而且我剛剛測試過lsof和ps aux,並且他們沒有拿起我通過samba製作的文件副本。 – MessedUpHare 2010-08-03 14:14:18