Sharpcompress 多 rar 提取进度

Posted

技术标签:

【中文标题】Sharpcompress 多 rar 提取进度【英文标题】:Sharpcompress multi rar extract progress 【发布时间】:2018-03-26 17:49:28 【问题描述】:

我正在构建一个从 tar 和 rar 档案中提取的应用程序。我可以根据目标中包含的 rar 的数量以及每一个被提取来报告目标的进度。在 rars 中有一个文件跨越几卷。我已经使用了单元测试示例中的代码

 var streams = testArchives.Select(s => Path.Combine(SCRATCH2_FILES_PATH, s)).Select(File.OpenRead).ToList();
 using (var reader = RarReader.Open(streams))
 
     while (reader.MoveToNextEntry())
    
         reader.WriteEntryToDirectory(SCRATCH_FILES_PATH, new ExtractionOptions()
         
           ExtractFullPath = true,
           Overwrite = true
         );
    
 

问题是进程直到当前条目被提取后才会报告。

【问题讨论】:

【参考方案1】:

不要使用 WriteEntryToDirectory 保存文件,因为它不包含回调进度,而是使用 FileStream 然后获取完整大小解压文件并切片保存进度好吗?

这是一个简单的例子:

thread = new Thread(
            new ThreadStart(() =>
            
                using (Archive = RarArchive.Open(streams, new ReaderOptions()  Password = password, LookForHeader = true ))
                
                    Archive.EntryExtractionBegin += EntryExtractionBeginEvet;
                    Archive.CompressedBytesRead += CompressedBytesReadEvent;
                    FilesTotalCount = Archive.Entries.Count();
                    TotalSize = Archive.TotalSize;
                    foreach (IArchiveEntry ArchiveEntry in Archive.Entries.Where(entry => !entry.IsDirectory))
                    
                        Directory.CreateDirectory(Path.GetDirectoryName(@"" + path + "\\" + ArchiveEntry.Key));
                        using (Stream archiveStream = ArchiveEntry.OpenEntryStream())
                        using (FileStream fileStream = new FileStream(@"" + path + "\\" + ArchiveEntry.Key, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
                        
                            int byteSizes = 0;
                            byte[] buffer = new byte[bufferLenght];
                            while (ThreadState == ThreadState.Running && (byteSizes = archiveStream.Read(buffer, 0, buffer.Length)) > 0)
                                fileStream.Write(buffer, 0, byteSizes);
                        
                    
                
                IO.CloseStreams(streams);
            
        ));
        thread.Start();

【讨论】:

请注意,这是一个英语网站。

以上是关于Sharpcompress 多 rar 提取进度的主要内容,如果未能解决你的问题,请参考以下文章

SharpCompress & LZMA2 7z 存档 - 特定文件的提取速度非常慢。为啥?备择方案?

SharpCompress的压缩文件解压和文件夹压缩

C#支持格式最多的解压缩开源库SharpCompress

使用 sharpcompress 创建一个 7zip 存档

使用 SharpCompress 库发布 WinRT 应用程序

使用通用流通过 SharpCompress 创建压缩文件