You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

大文件分块加解密后大小异常、数据不一致问题求助

大文件分块加解密文件大小不一致的问题解决

你的代码存在两个致命问题,直接导致文件大小异常和数据无法恢复:

  1. 未将处理后的字节写入临时文件:在加密/解密的第一个循环中,仅对缓冲区的字节做了加减操作,但从未调用Write方法将数据写入临时文件流,导致临时文件为空或数据缺失。
  2. 错误遍历整个缓冲区而非实际读取的字节数:循环中使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:44:59