diff --git a/src/SharpCompress/Archives/SevenZip/SevenZipArchive.cs b/src/SharpCompress/Archives/SevenZip/SevenZipArchive.cs index 88a85e963..eabc317ea 100644 --- a/src/SharpCompress/Archives/SevenZip/SevenZipArchive.cs +++ b/src/SharpCompress/Archives/SevenZip/SevenZipArchive.cs @@ -194,7 +194,10 @@ protected override IReader CreateReaderForSolidExtraction() => new SevenZipReader(ReaderOptions, this); public override bool IsSolid => - Entries.Where(x => !x.IsDirectory).GroupBy(x => x.FilePart.Folder).Count() > 1; + Entries + .Where(x => !x.IsDirectory) + .GroupBy(x => x.FilePart.Folder) + .Any(folder => folder.Count() > 1); public override long TotalSize => _database?._packSizes.Aggregate(0L, (total, packSize) => total + packSize) ?? 0; diff --git a/tests/SharpCompress.Test/SevenZip/SevenZipArchiveTests.cs b/tests/SharpCompress.Test/SevenZip/SevenZipArchiveTests.cs index 5e1d31765..b52d4bc23 100644 --- a/tests/SharpCompress.Test/SevenZip/SevenZipArchiveTests.cs +++ b/tests/SharpCompress.Test/SevenZip/SevenZipArchiveTests.cs @@ -204,4 +204,23 @@ public void SevenZipArchive_Tar_PathRead() Path.Combine(TEST_ARCHIVES_PATH, "7Zip.Tar.tar") ); } + + [Fact] + public void SevenZipArchive_TestSolidDetection() + { + using var oneBlockSolidArchive = SevenZipArchive.Open( + Path.Combine(TEST_ARCHIVES_PATH, "7Zip.solid.1block.7z") + ); + Assert.True(oneBlockSolidArchive.IsSolid); + + using var solidArchive = SevenZipArchive.Open( + Path.Combine(TEST_ARCHIVES_PATH, "7Zip.solid.7z") + ); + Assert.True(solidArchive.IsSolid); + + using var nonSolidArchive = SevenZipArchive.Open( + Path.Combine(TEST_ARCHIVES_PATH, "7Zip.nonsolid.7z") + ); + Assert.False(nonSolidArchive.IsSolid); + } } diff --git a/tests/TestArchives/Archives/7Zip.solid.1block.7z b/tests/TestArchives/Archives/7Zip.solid.1block.7z new file mode 100644 index 000000000..410e4f37c Binary files /dev/null and b/tests/TestArchives/Archives/7Zip.solid.1block.7z differ