2010-09-15 48 views
0

我在那裏的每一項都有一個文件路徑和最後一次修改數據庫字段中:最有效的方式來更新平面文件列表

1284581625555 C:\docs\text1.txt 
1284581646992 C:\docs\text2.txt 
1284581654886 C:\docs\text3.txt 
1284581662927 C:\docs\subfolder\text4.txt 
1284581671986 C:\docs\subfolder\text5.txt 
... 

每個條目也有文件內容的總結,和條目是通過遞歸地走下某個文件夾(在本例中爲C:\ docs)並添加所有訪問的文件而創建的。現在,我想對數據庫進行更新,即

  • 添加新創建的文件
  • 刪除刪除的文件
  • 更新修改的文​​件

很顯然,我必須再次走在根文件夾看看有什麼變化。但是,最有效的方法是什麼?

有我能想到的兩種方法:

  • 首先遍歷數據庫,刪除所有已刪除的條目,並更新所有修改的條目。爲此,每次必須從存儲的路徑字符串中創建一個文件對象,並調用file.exists()或file.isModified()。然後遞歸地遍歷根文件夾並添加不在數據庫中的文件。
  • 首先走下文件樹,記住列表中已添加/刪除/修改的內容---這需要存儲文件樹以前狀態的完整快照。然後遍歷數據庫並根據先前創建的列表添加/刪除/修改條目。

哪種方法更好?還有其他嗎?

編輯:創建摘要是非常昂貴的(全文摘錄),遍歷數據庫也有點昂貴,因爲它是基於文件的。

回答

2

我會認爲最簡單的方法是刪除並重新創建文件。取決於創建「摘要」有多困難,這可能是最快的方法,因爲您不需要比較或編輯任何內容。

如果摘要創建是「硬」並且數據庫適合內存,最簡單的方法是將數據庫加載到字典中(鍵入文件名,數據指示文件是否已經「看到」)並再次執行os.walk,必要時更新字典。然後迭代字典,寫出所有已經看到的條目。

(順便說一句的最後修改字段不一定有用,你無論如何都要檢查文件的修改時間,所以可能它也比較數據庫的時間戳。)

1

大概來處理這是最好的方式重新整體重新走樹。這樣,不是一直調用File.exist(),而只是每個目錄調用一次Directory.list()。這爲您節省了文件IO調用,這很可能是這種情況下的瓶頸。

一旦你擁有了當前存在的文件列表,你可以比較兩個列表,並確定每個文件:

  • 新文件
  • 刪除的文件
  • 修改過的文件

並據此進行。