2014-02-13 92 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

相关问题