通过遍历文件夹,查找出所有相同的文件。可对其重命名来标记出所有重复文件
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
#include<io.h>
#include<math.h>
#include<windows.h>
using namespace std;
struct FDa//用来保存文件名和文件大小
{
string name;
_fsize_t size;
};
bool comf(const char*t0,const char *t1)//逐字节比较两个文件是否相同
{
ifstream aa( t0,ios::binary );
ifstream bb(t1,ios::binary);
if(!aa.is_open()||!bb.is_open())
return 0;
while(!aa.eof()&&!bb.eof())
{
if(aa.get()!=bb.get())
{
// cout<<"different"<<endl;
aa.close();
bb.close();
return false;
}
}
aa.close();
bb.close();
return true;
}
bool comf1(FDa t0,FDa t1)//判断两个文件的大小是否相同
{
if(t0.size>t1.size) return true;
return false;
}
vector<string> findr(vector<FDa> &v)
{//对于按大小排序的一组文件,查找出相同文件,把文件名保存在动态数组中并返回
vector<string>d;
for(int i=0;i<v.size()-1;i++)
{
for(int j=i+1;j<v.size();)
{
if(v[i].size!=v[j].size)//文件大小不等,i++
break;
if(comf(v[i].name.c_str(),v[j].name.c_str()))//文件相同
{
d.push_back(v[j].name);
v.erase(v.begin()+j);
}
else//文件大小一样但文件不同
j++;
}
}
return d;
}
int main(int nu,char*na[])
{
//if(nu!=3)return 0;
vector<FDa>v;
_finddata_t f;
long l=_findfirst("*",&f);
while(_findnext(l,&f)==0)
{
if(f.attrib!=16)
v.push_back({f.name,f.size});
}
_findclose(l);
sort(v.begin(),v.end(),comf1);//按文件大小把文件名重新排序
vector<string>d=findr(v);
char c[60];
sprintf(c,"\t重复文件共%d个,\n\t是否重命名?",d.size());
int n1=MessageBox(NULL,c,"标题",MB_YESNO);
if(n1==IDYES)//将所有查找到的重复文件重新命名,文件名后添加“删重”两字
for(int i=0;i<d.size();i++)
{
string t=d[i];
size_t pos=t.rfind('.');
if(pos==string::npos)
t+="删重";
else
t.insert(pos,"删重");
rename(d[i].c_str(),t.c_str());
}
return 0;
}
开发环境MingW,编译时加后缀 -mwindows去掉控制台
运行效果