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

基于Sharpcompress实现多卷RAR解压进度上报的技术问询

解决分卷RAR的解压进度上报问题

嘿,我来帮你搞定分卷RAR的解压进度跟踪!针对单个跨多卷的RAR文件,核心思路是绕过封装好的WriteEntryToDirectory方法,手动处理流的复制过程,这样就能精准统计已解压的字节数,进而计算进度。下面是具体的实现步骤和代码示例:

关键思路

因为分卷RAR本质是把单个大压缩文件拆分成多个小文件,RarReader会自动处理分卷的拼接逻辑。我们只需要:

  1. 获取待解压文件的总未压缩大小(也就是最终解压后文件的大小)
  2. 手动读取压缩流并写入目标文件,每读取一段字节就更新进度
  3. 根据已解压字节数和总大小计算进度比例,完成上报

代码实现示例

var streams = testArchives.Select(s => Path.Combine(SCRATCH2_FILES_PATH, s)).Select(File.OpenRead).ToList();
using (var reader = RarReader.Open(streams))
{
    // 单个跨多卷RAR只有一个条目,所以只需处理一次
    if (reader.MoveToNextEntry())
    {
        var totalUnpackedSize = reader.Entry.UnpackedSize;
        long bytesExtracted = 0;
        var targetFilePath = Path.Combine(你的目标文件夹路径, reader.Entry.Name);

        // 手动处理流复制,跟踪进度
        using (var outputStream = File.Create(targetFilePath))
        using (var entryStream = reader.OpenEntryStream())
        {
            // 缓冲区大小可根据性能调整,比如8KB、16KB
            byte[] buffer = new byte[8192];
            int bytesRead;

            while ((bytesRead = entryStream.Read(buffer, 0, buffer.Length)) > 0)
            {
                outputStream.Write(buffer, 0, bytesRead);
                bytesExtracted += bytesRead;

                // 计算进度并上报
                double progressPercent = (double)bytesExtracted / totalUnpackedSize * 100;
                // 替换成你的进度上报逻辑,比如触发事件、更新UI等
                UpdateExtractionProgress(progressPercent, bytesExtracted, totalUnpackedSize);
            }
        }
    }
}

额外注意事项

  • 如果你的场景后续需要支持多文件的分卷RAR,只需在外层加上while (reader.MoveToNextEntry())循环,每个条目单独计算进度,再根据所有条目的总未压缩大小计算整体进度。
  • 缓冲区大小可以根据实际需求调整:更大的缓冲区能提升解压速度,但进度更新的频率会降低;更小的缓冲区则相反,可根据用户对进度实时性的要求权衡。
  • 进度上报时,除了百分比,还可以带上bytesExtracted和totalUnpackedSize,让用户能看到具体的已解压/总大小(比如“已解压1.2GB/5.6GB”),体验更友好。

内容的提问来源于stack exchange,提问作者Jonathan Whittingham

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:49:17