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技术站