大文件分块加解密后大小异常、数据不一致问题求助
大文件分块加解密文件大小不一致的问题解决
你的代码存在两个致命问题,直接导致文件大小异常和数据无法恢复:
- 未将处理后的字节写入临时文件:在加密/解密的第一个循环中,仅对缓冲区的字节做了加减操作,但从未调用
Write方法将数据写入临时文件流,导致临时文件为空或数据缺失。 - 错误遍历整个缓冲区而非实际读取的字节数:循环中使用
Data.Length遍历缓冲区,而不是实际读取到的bytesRead。当文件最后一块不满缓冲大小时,未读取的缓冲区部分默认是0,这部分被错误处理后写入,会导致文件体积变大,引入无效数据。
另外还有几个可优化的细节:
using语句会自动释放流资源,不需要手动调用Close()- 你的64MB缓冲区计算错误:
640000 * 1024得到的是约625MB,正确的64MB应该是64 * 1024 * 1024
修正后的加密代码
// 定义缓冲区大小(64MB) int bufferSize = 64 * 1024 * 1024; string tempFilePath = file + ".tmp"; // 加密并写入临时文件 using (FileStream originalStream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.None)) using (FileStream tempStream = new FileStream(tempFilePath, FileMode.Create, FileAccess.Write, FileShare.None)) { byte[] buffer = new byte[bufferSize]; int bytesRead; while ((bytesRead = originalStream.Read(buffer, 0, bufferSize)) > 0) { // 仅处理实际读取到的字节 for (int i = 0; i < bytesRead; i++) { buffer[i] += 1; } // 将处理后的字节写入临时文件 tempStream.Write(buffer, 0, bytesRead); } } // 替换原文件 File.Delete(file); File.Move(tempFilePath, file);
修正后的解密代码
// 定义缓冲区大小(64MB) int bufferSize = 64 * 1024 * 1024; string tempFilePath = file + ".tmp"; // 解密并写入临时文件 using (FileStream originalStream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.None)) using (FileStream tempStream = new FileStream(tempFilePath, FileMode.Create, FileAccess.Write, FileShare.None)) { byte[] buffer = new byte[bufferSize]; int bytesRead; while ((bytesRead = originalStream.Read(buffer, 0, bufferSize)) > 0) { // 仅处理实际读取到的字节 for (int i = 0; i < bytesRead; i++) { buffer[i] -= 1; } // 将处理后的字节写入临时文件 tempStream.Write(buffer, 0, bytesRead); } } // 替换原文件 File.Delete(file); File.Move(tempFilePath, file);
关键改进说明
- 合并了文件处理与复制流程,使用
File.Move替代手动复制,效率更高且避免冗余操作 - 严格以
bytesRead控制处理和写入的字节范围,彻底消除无效数据引入的问题 - 嵌套
using语句自动管理流资源,无需手动关闭文件 - 修正缓冲区大小计算,确保符合预期的内存占用
内容的提问来源于stack exchange,提问作者Anas Maarouf
相关产品推荐
相关产品推荐

