diff --git a/src/SharpCompress/Archives/IArchiveEntryExtensions.cs b/src/SharpCompress/Archives/IArchiveEntryExtensions.cs index 48c6c38a..0e9e4041 100644 --- a/src/SharpCompress/Archives/IArchiveEntryExtensions.cs +++ b/src/SharpCompress/Archives/IArchiveEntryExtensions.cs @@ -8,11 +8,6 @@ namespace SharpCompress.Archives { public static void WriteTo(this IArchiveEntry archiveEntry, Stream streamToWriteTo) { - if (archiveEntry.Archive.Type == ArchiveType.Rar && archiveEntry.Archive.IsSolid) - { - throw new InvalidFormatException("Cannot use Archive random access on SOLID Rar files."); - } - if (archiveEntry.IsDirectory) { throw new ExtractionException("Entry is a file directory and cannot be extracted."); diff --git a/src/SharpCompress/Archives/Rar/RarArchiveEntry.cs b/src/SharpCompress/Archives/Rar/RarArchiveEntry.cs index 3f2360b2..cb4fb169 100644 --- a/src/SharpCompress/Archives/Rar/RarArchiveEntry.cs +++ b/src/SharpCompress/Archives/Rar/RarArchiveEntry.cs @@ -57,11 +57,6 @@ namespace SharpCompress.Archives.Rar public Stream OpenEntryStream() { - if (archive.IsSolid) - { - throw new InvalidOperationException("Use ExtractAllEntries to extract SOLID archives."); - } - if (IsRarV3) { return new RarStream(archive.UnpackV1.Value, FileHeader, new MultiVolumeReadOnlyStream(Parts.Cast(), archive)); diff --git a/tests/SharpCompress.Test/ArchiveTests.cs b/tests/SharpCompress.Test/ArchiveTests.cs index c75aab72..cfa247e5 100644 --- a/tests/SharpCompress.Test/ArchiveTests.cs +++ b/tests/SharpCompress.Test/ArchiveTests.cs @@ -83,12 +83,6 @@ namespace SharpCompress.Test }); } } - catch (InvalidFormatException) - { - //rar SOLID test needs this - stream.ThrowOnDispose = false; - throw; - } catch (IndexOutOfRangeException) { //SevenZipArchive_BZip2_Split test needs this diff --git a/tests/SharpCompress.Test/Rar/RarArchiveTests.cs b/tests/SharpCompress.Test/Rar/RarArchiveTests.cs index 05ee1bb0..b521bd5c 100644 --- a/tests/SharpCompress.Test/Rar/RarArchiveTests.cs +++ b/tests/SharpCompress.Test/Rar/RarArchiveTests.cs @@ -203,13 +203,13 @@ namespace SharpCompress.Test.Rar [Fact] public void Rar_Solid_ArchiveStreamRead() { - Assert.Throws(() => ArchiveStreamRead("Rar.solid.rar")); + ArchiveStreamRead("Rar.solid.rar"); } [Fact] public void Rar5_Solid_ArchiveStreamRead() { - Assert.Throws(() => ArchiveStreamRead("Rar5.solid.rar")); + ArchiveStreamRead("Rar5.solid.rar"); } [Fact] @@ -232,7 +232,7 @@ namespace SharpCompress.Test.Rar "Rar.multi.part03.rar", "Rar.multi.part04.rar", "Rar.multi.part05.rar", - "Rar.multi.part06.rar"}); + "Rar.multi.part06.rar"}, false); } [Fact] @@ -243,14 +243,15 @@ namespace SharpCompress.Test.Rar "Rar5.multi.part03.rar", "Rar5.multi.part04.rar", "Rar5.multi.part05.rar", - "Rar5.multi.part06.rar"}); + "Rar5.multi.part06.rar"}, false); } - private void DoRar_Multi_ArchiveStreamRead(string[] archives) + private void DoRar_Multi_ArchiveStreamRead(string[] archives, bool isSolid) { using (var archive = RarArchive.Open(archives.Select(s => Path.Combine(TEST_ARCHIVES_PATH, s)) .Select(File.OpenRead))) { + Assert.Equal(archive.IsSolid, isSolid); foreach (var entry in archive.Entries.Where(entry => !entry.IsDirectory)) { entry.WriteToDirectory(SCRATCH_FILES_PATH, new ExtractionOptions() @@ -260,7 +261,18 @@ namespace SharpCompress.Test.Rar }); } } - VerifyFiles(); + } + + [Fact] + public void Rar5_MultiSolid_Extract_All() + { + DoRar_Multi_ArchiveStreamRead(new string[] { + "Rar.multi.solid.part01.rar", + "Rar.multi.solid.part02.rar", + "Rar.multi.solid.part03.rar", + "Rar.multi.solid.part04.rar", + "Rar.multi.solid.part05.rar", + "Rar.multi.solid.part06.rar"}, true); } [Fact] @@ -332,13 +344,13 @@ namespace SharpCompress.Test.Rar [Fact] public void Rar_Solid_ArchiveFileRead() { - Assert.Throws(() => ArchiveFileRead("Rar.solid.rar")); + ArchiveFileRead("Rar.solid.rar"); } [Fact] public void Rar5_Solid_ArchiveFileRead() { - Assert.Throws(() => ArchiveFileRead("Rar5.solid.rar")); + ArchiveFileRead("Rar5.solid.rar"); } [Fact] diff --git a/tests/TestArchives/Archives/Rar.multi.solid.part01.rar b/tests/TestArchives/Archives/Rar.multi.solid.part01.rar new file mode 100644 index 00000000..e018c9d2 Binary files /dev/null and b/tests/TestArchives/Archives/Rar.multi.solid.part01.rar differ diff --git a/tests/TestArchives/Archives/Rar.multi.solid.part02.rar b/tests/TestArchives/Archives/Rar.multi.solid.part02.rar new file mode 100644 index 00000000..461774a9 Binary files /dev/null and b/tests/TestArchives/Archives/Rar.multi.solid.part02.rar differ diff --git a/tests/TestArchives/Archives/Rar.multi.solid.part03.rar b/tests/TestArchives/Archives/Rar.multi.solid.part03.rar new file mode 100644 index 00000000..cef5a871 Binary files /dev/null and b/tests/TestArchives/Archives/Rar.multi.solid.part03.rar differ diff --git a/tests/TestArchives/Archives/Rar.multi.solid.part04.rar b/tests/TestArchives/Archives/Rar.multi.solid.part04.rar new file mode 100644 index 00000000..0f78edfe Binary files /dev/null and b/tests/TestArchives/Archives/Rar.multi.solid.part04.rar differ diff --git a/tests/TestArchives/Archives/Rar.multi.solid.part05.rar b/tests/TestArchives/Archives/Rar.multi.solid.part05.rar new file mode 100644 index 00000000..cce6e105 Binary files /dev/null and b/tests/TestArchives/Archives/Rar.multi.solid.part05.rar differ diff --git a/tests/TestArchives/Archives/Rar.multi.solid.part06.rar b/tests/TestArchives/Archives/Rar.multi.solid.part06.rar new file mode 100644 index 00000000..84283968 Binary files /dev/null and b/tests/TestArchives/Archives/Rar.multi.solid.part06.rar differ