C++ 比对两个目录下有哪些文件不同
C++ 比对两个目录下有哪些文件不同
去年的时候整理了一堆学习资源,还有一点没整理完,原始资源放在几个目录下,整理好的放在另一个目录下,准备把原始资源删掉,但又不知道还有哪些文件没整理,文件太多又不能手动去对比,于是写了下面的程序来帮我干这事。
核心部分其实就是遍历目录包括子目录,获取所有文件的文件名,并记录其路径,输入的两个目录暂时程序写死的,偷懒而已。。。这不重要,重要的是让我知道还有哪些文件没处理。
#include <io.h>
#include <iostream>
#include <list>
#include <string>
using namespace std;
struct Mp4FileInfo
{
string path;
string name;
};
void FindFilesInDir(string path, list<Mp4FileInfo>& files, string extFile = "*.*");
void main()
{
list<Mp4FileInfo> srcFiles; // 要处理的所有文件
list<Mp4FileInfo> destFiles; // 处理好的所有文件
list<string> diffFiles; // 未处理的所有文件
list<string> findFiles; // 已经处理了的所有文件
// 从目录中读取所有要处理的文件
FindFilesInDir("E:\\share\\src", srcFiles); // 目录写死的
// 从目录中读取所有处理好的文件
FindFilesInDir("G:\\out", destFiles);
// 两个list 比对一下
for (auto info : srcFiles) {
info.name.erase(info.name.find(".mp4"), 4); // 把文件后缀名去掉,再比文件名
bool bFind = false;
for (auto infoDest : destFiles) {
infoDest.name.erase(infoDest.name.find(".mp4"), 4);
if (info.name.find(infoDest.name) != string::npos) {
bFind = true;
cout << "file: 《" << info.name << "》 handled! \n";
findFiles.push_back(infoDest.path);
break;
}
}
if (!bFind) diffFiles.push_back(info.path);
}
cout << "------------------------------------------------------------------------------------------------\n";
for (auto it : diffFiles) {
cout << it << endl;
}
cout << "=> Total " << diffFiles.size() << " files not handled! \n";
cout << "------------------------------------------------------------------------------------------------\n";
for (auto it : findFiles) {
cout << it << endl;
}
cout << "=> Total " << findFiles.size() << " files handled! \n";
system("pause");
}
void FindFilesInDir(string path, list<Mp4FileInfo>& files, string extFile/* = "*.*"*/)
{
// 文件句柄
int hFile = 0;
// 文件信息
struct _finddata_t fileinfo;
string path_tmp;
if ((hFile = _findfirst(path_tmp.assign(path).append("\\*").c_str(), &fileinfo)) != -1) {
do {
// 如果是目录,递归一下
// 如果不是,加入列表
if ((fileinfo.attrib & _A_SUBDIR)) {
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0) {
path_tmp = path + "\\" + fileinfo.name;
FindFilesInDir(path_tmp.c_str(), files, extFile);
}
}
else {
if (extFile.size() == 0 || (extFile.size() > 0 && (extFile.c_str(), strchr(fileinfo.name, '.')))) {
Mp4FileInfo mp4File;
mp4File.name = fileinfo.name;
mp4File.path = path + "\\" + fileinfo.name;
files.push_back(mp4File);
}
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
编译运行一下:
结果出来了,妥妥的!