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
相关产品推荐
相关产品推荐

