C# Sharpcompress多rar提取过程

C# Sharpcompress多rar提取过程,c#,sharpcompress,C#,Sharpcompress,我正在构建一个从tar和rar档案中提取的应用程序。我可以根据目标中包含的rar量以及提取每个rar时报告目标的进度。在rars中,有一个文件跨越多个卷。我使用了单元测试示例中的代码 var streams = testArchives.Select(s => Path.Combine(SCRATCH2_FILES_PATH, s)).Select(File.OpenRead).ToList(); using (var reader = RarReader.Open(streams))

我正在构建一个从tar和rar档案中提取的应用程序。我可以根据目标中包含的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
         });
    }
 }

问题是,在提取当前条目之前,进程不会报告。

不要使用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();

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