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

C#中BZip2文件解压后大小计算错误排查求助

问题分析与修复方案

你的代码计算BZip2解压后大小错误的核心原因是:

  • 使用StreamReader.Read()返回的是字符数量,而非字节数量。StreamReader会将解压后的字节流按指定编码(默认UTF-8)转换为字符,字符数和原始字节数并不总是相等(比如多字节编码的字符),导致累加的结果和实际解压后的字节大小不符。
  • 额外问题:File.ReadAllBytes()会将整个压缩文件加载到内存,处理大文件时会造成内存压力。

修复后的代码

private long CalculateUncompressedSize(string bzip2FilePath)
{
    long totalUncompressedSize = 0;

    try
    {
        // 直接打开文件流,避免一次性加载全部内容到内存
        using (var fileStream = File.OpenRead(bzip2FilePath))
        using (var unzipStream = new BZip2InputStream(fileStream))
        {
            byte[] buffer = new byte[4096];
            int bytesRead;
            // 直接读取字节流,累加实际读取的字节数
            while ((bytesRead = unzipStream.Read(buffer, 0, buffer.Length)) > 0)
            {
                totalUncompressedSize += bytesRead;
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Error calculating BZip2 uncompressed size: {ex.Message}");
    }

    return totalUncompressedSize;
}

关键修改点

  • 替换StreamReader为直接操作BZip2InputStream的字节读取,确保累加的是字节数而非字符数。
  • 使用File.OpenRead()打开文件流,流式处理压缩文件,降低内存占用。
  • 修正方法名(原Main不符合C#规范,Main是程序入口方法,不能作为普通实例方法使用)。

内容的提问来源于stack exchange,提问作者Jakub Pal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 08:33:28