我们有使用boost文件系统删除重复文件的方法/方法吗?

时间:2014-02-13 09:43:03

标签: c++ boost

我们在boost文件系统中是否有任何方法/方法可以使用c ++从特定目录中删除重复文件?

我使用下面的代码检索了特定目录中的所有文件。现在我想找到重复项然后删除它们。

使用boost文件系统在目录中递归列出文件的代码:

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";
}

提前致谢。

3 个答案:

答案 0 :(得分:0)

没有。这是一个相当具体的用例,因此您必须自己编写代码。

基本上,最好的程序是一个三步程序:首先按大小对文件进行排序。不同大小,不同文件。其次,对于具有相同大小的所有文件,读取第一个4K并比较它们(跳过此步骤以获取小文件)。最后,如果第一个4K相同,则比较整个文件。

答案 1 :(得分:0)

@MSalters已经知道如何处理这个问题。听起来你最好散列文件的内容,然后比较哈希的相等性。纯粹依靠尺寸可能不够好。比较哈希,您可以知道整个文件系统中的文件是相同的。

答案 2 :(得分:0)

@murrekat @MSalters确实建议单靠大小。相反,根据大小预先选择潜在的匹配是一个非常非常明智的想法,因为你可能会看到为大量数据生成哈希的日子,当你完成它们时它们已经过时了:)

我所知道的所有fdupe工具都采用这种方法:快速,便宜(最好基于filestat信息),只有在有潜在匹配时才比较内容。

执行逐块比较通常胜过哈希比较,因为它可以完成流式传输,只要检测到差异就可以丢弃匹配 - 无需读取整个文件。

在某些情况下,比较全内容哈希值可能是有益的:

  1. 当你有许多文件没有改变时(你可以将预先计算的哈希存储在数据库中,这可以平衡你必须读取整个文件以根据事实计算哈希的事实在任何后续运行中都没有。

  2. 当您预计某些文件可能会大规模复制时。在这种情况下,您希望与的比较早期显着比例,并且您可以避免阅读比较的一方。

  3. 当您预期(很多)重复项组&gt; 2时,基本上与#2相同的原因