增量备份的核心判断依据是内容哈希而非文件修改时间;因last_write_time精度低、易被篡改,仅靠其判断不可靠,必须结合sha-256等哈希值校验文件内容是否真实变更。

增量备份的核心判断依据是文件修改时间还是哈希值
用 std::filesystem::last_write_time() 判断是否变更最快,但不可靠:NTFS 时间精度只有 100ns,FAT32 更粗(2s),且用户可能手动改时间或跨时区复制。真正安全的增量逻辑必须依赖内容哈希(如 SHA-256),哪怕慢一点。
实操建议:
- 对小文件(SHA-256;大文件先比对大小+修改时间,仅当两者一致再跳过哈希计算
- 不要用
MD5或SHA-1,它们已不满足防碰撞要求 - Windows 上注意
last_write_time()返回的是本地时区时间,跨系统同步时需转为 UTC 比较
如何高效读取大文件并计算 SHA-256(避免内存爆炸)
C++ 标准库不带哈希算法,得用 OpenSSL 或 libsodium。OpenSSL 更常见,但要注意其 EVP_DigestUpdate() 接口必须分块调用,不能一次性 fread() 整个文件进内存。
关键步骤:
- 用
std::ifstream以std::ios::binary模式打开,设置缓冲区大小为 64KB(file.rdbuf()->pubsetbuf(buf, sizeof(buf))) - 每次
read()后立即传给EVP_DigestUpdate(),别缓存整块数据 - 千万避免用
std::filesystem::file_size()做预分配——对网络文件或设备文件会失败甚至阻塞
备份目标路径下如何避免重复写入相同内容
增量备份不是“只拷贝新文件”,而是“只写入内容有变的文件”。所以目标目录里每个文件应附带一个同名的 .sha256 文件,存原始文件的哈希值。每次备份前先查这个校验文件是否存在、是否匹配。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
具体逻辑:
- 源路径
src/a.txt→ 目标路径dst/a.txt+dst/a.txt.sha256 - 若
dst/a.txt.sha256存在且内容等于当前src/a.txt的哈希,则跳过写入 - 若
dst/a.txt存在但.sha256缺失,说明是旧版备份,必须重新生成哈希并覆盖 - 不要依赖硬链接或 reflink——不同文件系统支持不一,且无法跨设备
Windows 下 CopyFileEx 和 std::filesystem::copy 的实际差异
std::filesystem::copy() 在 Windows 底层调用的就是 CopyFileEx(),但默认不启用进度回调和取消机制。真正在备份大文件时,你得自己封装一层。
必须处理的情况:
- 用
CopyFileEx()时传入非空LPPROGRESS_ROUTINE,否则无法感知卡死或磁盘满 -
std::filesystem::copy的copy_options::skip_existing只检查文件存在,不检查内容——它根本不是增量逻辑 - 如果目标盘剩余空间不足,
CopyFileEx()返回ERROR_DISK_FULL,而std::filesystem::copy会抛std::filesystem::filesystem_error,错误码难映射
增量备份最难的不是算哈希,而是把“文件内容未变”这件事,在多层抽象(C++ 标准库、OS API、磁盘缓存、网络存储)之间保持语义一致。稍不留神,就变成“看着像增量,实际全量覆盖”。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










