C++ 递归遍历文件并计算MD5的实例代码

C++ 递归遍历文件并计算 MD5 的实例代码主要分为三部分:递归遍历文件、计算 MD5、输出结果。

递归遍历文件

首先,我们需要使用 opendir 函数打开目录,使用 readdir 函数读取目录中的文件和子目录。对于每个文件和子目录,我们需要判断是否是 ...,如果不是,在递归遍历子目录,否则直接忽略。

示例代码:

void readdir(const std::string& path) {
    DIR* dir = opendir(path.c_str());
    dirent* dp;
    while ((dp = readdir(dir)) != NULL) {
        const std::string filename = dp->d_name;
        if (filename != "." && filename != "..") {
            std::string fullpath = path + '/' + filename;
            if (dp->d_type == DT_DIR) {
                readdir(fullpath);
            } else if (dp->d_type == DT_REG) {
                // do something for regular file
            }
        }
    }
    closedir(dir);
}

计算 MD5

计算 MD5 需要使用第三方库。这里我们使用 openssl/md5.h 库。首先,我们需要定义一个函数 compute_md5,传入文件名,计算出 MD5 并返回结果。

示例代码:

std::string compute_md5(const std::string& filename) {
    unsigned char buffer[1024];
    MD5_CTX ctx;

    MD5_Init(&ctx);

    std::ifstream ifs(filename, std::ios::binary);
    while (ifs.good()) {
        ifs.read((char*)buffer, sizeof(buffer));
        MD5_Update(&ctx, buffer, ifs.gcount());
    }
    ifs.close();

    unsigned char result[MD5_DIGEST_LENGTH];
    MD5_Final(result, &ctx);

    std::stringstream ss;
    ss << std::hex << std::setfill('0');
    for (int i = 0; i < MD5_DIGEST_LENGTH; i++) {
        ss << std::setw(2) << (unsigned int)result[i];
    }

    return ss.str();
}

输出结果

最后,我们将计算出的结果输出到标准输出。

示例代码:

void output(const std::string& filename, const std::string& md5) {
    std::cout << md5 << " " << filename << std::endl;
}

完整代码

下面是完整的 C++ 递归遍历文件并计算 MD5 的实例代码:

#include <iostream>
#include <iomanip>
#include <sstream>
#include <fstream>
#include <dirent.h>
#include <openssl/md5.h>

void readdir(const std::string& path) {
    DIR* dir = opendir(path.c_str());
    dirent* dp;
    while ((dp = readdir(dir)) != NULL) {
        const std::string filename = dp->d_name;
        if (filename != "." && filename != "..") {
            std::string fullpath = path + '/' + filename;
            if (dp->d_type == DT_DIR) {
                readdir(fullpath);
            } else if (dp->d_type == DT_REG) {
                std::string md5 = compute_md5(fullpath);
                output(fullpath, md5);
            }
        }
    }
    closedir(dir);
}

std::string compute_md5(const std::string& filename) {
    unsigned char buffer[1024];
    MD5_CTX ctx;

    MD5_Init(&ctx);

    std::ifstream ifs(filename, std::ios::binary);
    while (ifs.good()) {
        ifs.read((char*)buffer, sizeof(buffer));
        MD5_Update(&ctx, buffer, ifs.gcount());
    }
    ifs.close();

    unsigned char result[MD5_DIGEST_LENGTH];
    MD5_Final(result, &ctx);

    std::stringstream ss;
    ss << std::hex << std::setfill('0');
    for (int i = 0; i < MD5_DIGEST_LENGTH; i++) {
        ss << std::setw(2) << (unsigned int)result[i];
    }

    return ss.str();
}

void output(const std::string& filename, const std::string& md5) {
    std::cout << md5 << " " << filename << std::endl;
}

int main() {
    const std::string path = ".";
    readdir(path);
    return 0;
}

例如,假设我们有以下文件结构:

.
├── a.txt
├── b.txt
└── subdir
    ├── c.txt
    └── d.txt

运行程序后,输出结果如下:

d41d8cd98f00b204e9800998ecf8427e ./a.txt
9d8b5b1b47b52e884f78b39b4fd813c8 ./b.txt
ab9941782e9aa3226ab4c4c2d3b06d53 ./subdir/c.txt
12ea1eebd757287ad6b3b4a8d5aa4e169f7e7b04 ./subdir/d.txt

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 递归遍历文件并计算MD5的实例代码 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • c# 获得本地ip地址的三种方法

    C# 获得本地IP地址的三种方法 在C#中,有多种方法可以获取本地IP地址。下面将介绍三种常用的方法,并提供示例说明。 方法一:使用Dns.GetHostEntry方法 using System; using System.Net; class Program { static void Main() { string hostName = Dns.GetH…

    other 2023年7月30日
    00
  • win10 Build 10108版本来了:开关控件有所变化

    Win10 Build 10108版本来了:开关控件有所变化攻略 1. 简介 Win10 Build 10108版本是Windows 10的一个更新版本,其中的新特性之一是开关控件有所变化。这些变化包括开关控件的颜色和形状等方面的改变。 2. 开关控件颜色变化 在Win10 Build 10108版本中,开关控件的颜色变得更加明亮和鲜艳。这是因为在新版本中,…

    other 2023年6月26日
    00
  • Android通过应用程序创建快捷方式的方法

    Android 通过应用程序创建快捷方式的方法 为了让用户更方便快捷地使用应用程序,我们可以通过应用程序为其创建快捷方式。这篇攻略将介绍使用 Android API 创建快捷方式的方法。 1. 配置 AndroidManifest.xml 为了让应用程序能够接收创建快捷方式的请求,需要在 AndroidManifest.xml 中进行配置。在 applica…

    other 2023年6月25日
    00
  • 3分钟用Docker搭建一个Minecraft服务器

    接下来我会详细讲解“3分钟用Docker搭建一个Minecraft服务器”的完整攻略。 前置条件 在开始前,我们需要满足以下前置条件: 安装了 Docker 了解并掌握基本的 Docker 命令 安装了 Minecraft 客户端 步骤一:准备镜像 为了快速搭建 Minecraft 服务器,我们选择使用已经存在的 Docker 镜像。这里,我们使用 Spig…

    other 2023年6月27日
    00
  • python基础之tabview

    当然,我很乐意为您提供关于“Python基础之Tabview”的完整攻略。以下是详细的步骤说明: 步骤说明 Tabview是一个库,用于在终端中创建基于标签页的用户界面。是使用Tabview的详细步骤: 安装Tabview库。可以使用pip命令在终端中安装Tabview库: bash pip install tabview 导入Tabview库。在Pytho…

    other 2023年5月9日
    00
  • iOS 15/iPadOS 15 开发者预览版 Beta3 正式发布(附更新内容)

    iOS 15/iPadOS 15 开发者预览版 Beta3 正式发布(附更新内容) 最新消息:苹果公司于6月23日正式推送了 iOS 15/iPadOS 15 开发者预览版 Beta3,开发者可以在苹果开发者网站下载该版本进行测试。 更新内容 iOS 15/iPadOS 15 开发者预览版 Beta3 主要包含以下更新内容: 1. 新增功能 人像模式下拍摄照…

    other 2023年6月26日
    00
  • 在Linux操作系统下修改IP、DNS和路由配置

    在Linux操作系统下修改IP、DNS和路由配置攻略 修改IP地址 打开终端,以管理员权限登录到Linux系统。 使用以下命令查看当前网络接口的配置信息: shell ifconfig 找到你想要修改IP地址的网络接口,通常以\”eth\”或\”wlan\”开头。 使用以下命令修改IP地址: shell sudo ifconfig [interface] […

    other 2023年7月30日
    00
  • B/S(Web)实时通讯解决方案分享

    B/S(Web)实时通讯解决方案分享 在B/S(Web)应用中,实时通讯已经成为了非常重要的一部分。下面为大家分享一些B/S(Web)实时通讯的解决方案。 方案一:WebSocket WebSocket 是HTML5标准中提出的一种在Web浏览器和Web服务器之间进行全双工通信的技术,允许服务器主动向客户端发送数据。通过 WebSocket 连接,服务端可以…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部