diff --git a/src/SharpCompress/Archives/SevenZip/SevenZipArchive.cs b/src/SharpCompress/Archives/SevenZip/SevenZipArchive.cs index 0a8821b8..66296b57 100644 --- a/src/SharpCompress/Archives/SevenZip/SevenZipArchive.cs +++ b/src/SharpCompress/Archives/SevenZip/SevenZipArchive.cs @@ -36,32 +36,45 @@ public partial class SevenZipArchive : AbstractArchive volumes ) { - var stream = volumes.Single().Stream; - LoadFactory(stream); - if (_database is null) + foreach (var volume in volumes) { - return Enumerable.Empty(); - } - var entries = new SevenZipArchiveEntry[_database._files.Count]; - for (var i = 0; i < _database._files.Count; i++) - { - var file = _database._files[i]; - entries[i] = new SevenZipArchiveEntry( - this, - new SevenZipFilePart(stream, _database, i, file, ReaderOptions.ArchiveEncoding) - ); - } - foreach (var group in entries.Where(x => !x.IsDirectory).GroupBy(x => x.FilePart.Folder)) - { - var isSolid = false; - foreach (var entry in group) + LoadFactory(volume.Stream); + if (_database is null) { - entry.IsSolid = isSolid; - isSolid = true; //mark others in this group as solid - same as rar behaviour. + yield break; + } + var entries = new SevenZipArchiveEntry[_database._files.Count]; + for (var i = 0; i < _database._files.Count; i++) + { + var file = _database._files[i]; + entries[i] = new SevenZipArchiveEntry( + this, + new SevenZipFilePart( + volume.Stream, + _database, + i, + file, + ReaderOptions.ArchiveEncoding + ) + ); + } + foreach ( + var group in entries.Where(x => !x.IsDirectory).GroupBy(x => x.FilePart.Folder) + ) + { + var isSolid = false; + foreach (var entry in group) + { + entry.IsSolid = isSolid; + isSolid = true; + } + } + + foreach (var entry in entries) + { + yield return entry; } } - - return entries; } private void LoadFactory(Stream stream) diff --git a/tests/SharpCompress.Test/SevenZip/SevenZipArchiveTests.cs b/tests/SharpCompress.Test/SevenZip/SevenZipArchiveTests.cs index da9e0965..bcaf32b3 100644 --- a/tests/SharpCompress.Test/SevenZip/SevenZipArchiveTests.cs +++ b/tests/SharpCompress.Test/SevenZip/SevenZipArchiveTests.cs @@ -260,7 +260,7 @@ public class SevenZipArchiveTests : ArchiveTests // This test verifies that solid archives iterate entries as contiguous streams // rather than recreating the decompression stream for each entry var testArchive = Path.Combine(TEST_ARCHIVES_PATH, "7Zip.solid.7z"); - using var archive = SevenZipArchive.Open(testArchive); + using var archive = SevenZipArchive.OpenArchive(testArchive); Assert.True(archive.IsSolid); using var reader = archive.ExtractAllEntries(); @@ -284,7 +284,7 @@ public class SevenZipArchiveTests : ArchiveTests // This test verifies that the folder stream is reused within each folder // and not recreated for each entry in solid archives var testArchive = Path.Combine(TEST_ARCHIVES_PATH, "7Zip.solid.7z"); - using var archive = SevenZipArchive.Open(testArchive); + using var archive = SevenZipArchive.OpenArchive(testArchive); Assert.True(archive.IsSolid); using var reader = archive.ExtractAllEntries(); diff --git a/tests/SharpCompress.Test/Zip/ZipShortReadTests.cs b/tests/SharpCompress.Test/Zip/ZipShortReadTests.cs index d61a27c7..34c2777b 100644 --- a/tests/SharpCompress.Test/Zip/ZipShortReadTests.cs +++ b/tests/SharpCompress.Test/Zip/ZipShortReadTests.cs @@ -97,7 +97,10 @@ public class ZipShortReadTests : ReaderTests private List ReadEntriesFromStream(Stream stream) { var names = new List(); - using var reader = ReaderFactory.Open(stream, new ReaderOptions { LeaveStreamOpen = true }); + using var reader = ReaderFactory.OpenReader( + stream, + new ReaderOptions { LeaveStreamOpen = true } + ); while (reader.MoveToNextEntry()) {