C++ 比对两个目录下有哪些文件不同

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

编译运行一下:
在这里插入图片描述
结果出来了,妥妥的!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尹笑辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值