2014-08-30 69 views
0

我想要監視一個文件夾並查看是否添加了新文件或修改了現有文件。問題是,並不能保證我的程序會一直運行(因此,基於inotify的解決方案可能不適用於此)。我需要緩存最後一次掃描的狀態,然後使用下一次掃描,在處理文件之前我需要將它與最後一次掃描進行比較。如何在Python中查找修改後的文件

在Python 2.7中實現此功能有哪些選擇?

注1:文件的處理很昂貴,所以我試圖處理那些在此期間未修改的文件。所以,如果文件只是重命名(而不是文件內容的改變),我還想檢測並跳過處理。注2:我只對Linux解決方案感興趣,但如果添加其他平臺的答案,我不會抱怨。

+0

它會是遠不及複雜的,如果你能保證你的程序將運行所有的時間,不是存儲時,它不是,然後試圖重新掃描更改... – 2014-08-30 21:43:46

+0

@JonClements是的,但不幸的是這是不可能的。基本上,用戶確定程序何時運行。這是該計劃的性質。 – 2014-08-30 21:52:25

+0

只需創建一個包含文件名和最後修改日期的字典(可以使用'os.stat()'獲得),然後將其寫入一個文件並在每次運行時讀取它 – wnnmaw 2014-08-30 22:10:46

回答

1

有幾種方法可以檢測文件中的更改。有些人比其他人更容易被愚弄。這聽起來不像是一個安全問題;更多 如同誠信假設,你只需要檢測變化而不需要 不得不智勝對手。

你可以看看時間戳。如果文件沒有被重命名,這是檢測更改的好方法 。如果它們被重新命名,單獨的時間戳就不足以可靠地將另一個文件告訴一個文件。 os.stat會告訴你 上次修改文件的時間。

您可以查看inode,例如ls -li。如果更改涉及創建新文件並刪除舊文件,則文件的inode編號可能會更改爲 ;例如,這是 emacs通常如何更改文件。嘗試使用組織使用的標準工具更改文件 ,並在 之前和之後比較inode;但請記住,即使這次沒有改變,它在某些情況下可能會改變。 os.stat會告訴你inode 號碼。

您可以查看文件的內容。 cksum計算一個文件上的一個小的CRC校驗和 ;如果有人願意,很容易擊敗。程序 等sha256sum計算安全散列;在不更改這種散列的情況下更改文件 是不可行的。如果文件很大,這可能會很慢。 hashlib模塊將計算幾種安全哈希。

如果一個文件被重命名和改變,其索引節點號的變化,這將 可能非常難以與它曾經 是,該文件匹配起來,除非該文件中的數據包含某種一成不變的和 唯一標識符。

考慮併發性。程序運行時,有人可能會更改 文件嗎?謹防競態條件。

0

我可能會用某種sqlite解決方案,比如寫最後的輪詢時間。 然後在每個這樣的輪詢中,按last_modified_time(mtime)對文件進行排序,並獲得所有mtime大於以前的輪詢的人(如果你堅持沒有,那麼這個值將從sqlite或某種文件中取出這樣的分貝的要求)。

1

監控新文件並不困難 - 只保留目錄中所有文件的inode列表或數據庫。一個新文件將引入一個新的inode。這也將幫助您避免處理重命名的文件,因爲inode在重命名時不會更改。

更難的問題是監視文件更改。如果您還爲每個inode存儲文件大小,那麼明顯更改的大小表示更改的文件,並且您不需要打開並處理該文件即可知道該文件。但對於(a)之前已記錄的inode和(b)大小與之前相同的文件,您需要處理文件(例如,計算校驗和)以確定它是否已更改。

0

我建議作弊和使用系統find命令。例如,以下內容將查找在最近60分鐘內修改或創建的所有Python文件。使用ls輸出可以確定是否需要進一步檢查。

$ echo beer > zoot.py 
$ find . -name '*.py' -mmin -60 -type f -ls 
1973329 4 -rw-r--r-- 1 johnm johnm   5 Aug 30 15:17 ./zoot.py 
相關問題