2014-02-13 58 views
0

我們有沒有在boost文件系統中使用C++從特定目錄中刪除重複文件的方法/方法?我們有使用boost文件系統刪除重複文件的方法嗎?

我在用下面code.Now我想找到重複的,然後將其刪除特定目錄retreived所有文件。

代碼使用提高文件系統遞歸地列出目錄中的文件:

void listFiles() 
{ 
fs::path sourceFolder; 
//SourceFolder 
std::cout<<"SourceFolder:"; 
std::cin>>sourceFolder; 

for(fs::recursive_directory_iterator it(sourceFolder), end_itr; it != end_itr; ++it) 
    { 
    if(!fs::is_regular_file(it->status())) 
     continue; 
    std::cout <<it->path().filename() <<endl; 
    } 
std::cout<<"Thanks for using file manager"; 
} 

在此先感謝。

回答

0

號這是一個相當具體的使用情況,所以你必須自己編寫的代碼。

基本上,最好程序是一個三步過程:通過大小對文件首先進行排序。不同的大小,不同的文件。其次,對於大小相同的所有文件,請閱讀第一個4K並對其進行比較(對於小文件,請跳過此步驟)。最後,如果第一個4K是相同的,則比較整個文件。

0

@MSalters已經給了一個想法如何處理這個。這聽起來像你最好散列文件的內容,然後比較哈希值是否相等。單純依靠尺寸可能不夠好。比較哈希值可以知道整個文件系統中的文件是相同的。

+0

散列需要完整的文件讀取,這是相當昂貴的。存儲結果並不需要太多,但由於哈希值並不是唯一的,所以**仍然需要稍後進行全面檢查。所以如果您發現潛在的重複,您需要閱讀整個文件兩次。 – MSalters

0

@murrekat @MSalters did 不是建議僅依靠大小。相反,它是一個非常非常理智的想法預選基於大小潛在的比賽,因爲你可以在看天,以便產生了大量的數據,並通過你做他們會外的日期時間哈希:)

所有fdupe工具,我知道有這樣的方法:如果有潛在的匹配快速,廉價的(最好是基於FILESTAT信息),只有比較的內容。

做分塊比較往往會勝過散列比較,因爲它可以完成流式傳輸,只要檢測到差異就可以丟棄匹配 - 根本不需要讀取整個文件。

比較全的內容哈希值可以在某些情況下是有益的:

  1. 時,你有沒有改變許多文件(可以存儲在數據庫中的預先計算散列,平衡的事實你必須閱讀整個文件來計算哈希值,因爲你不會在後續運行中。

  2. 當你預計某些文件可能被大量複製時,在這種情況下,您預計與的比較不是提前顯着的百分比時間d你可以避免閱讀比較的一面。

  3. 當你期望(很多)套副本> 2的,基本上是同樣的原因#2

相關問題