diff --git a/src/SharpCompress/Archives/IArchiveExtensions.cs b/src/SharpCompress/Archives/IArchiveExtensions.cs index 337e4ccc..d9701da3 100644 --- a/src/SharpCompress/Archives/IArchiveExtensions.cs +++ b/src/SharpCompress/Archives/IArchiveExtensions.cs @@ -45,12 +45,10 @@ public static class IArchiveExtensions var seenDirectories = new HashSet(); // Extract - var entries = archive.ExtractAllEntries(); - while (entries.MoveToNextEntry()) + foreach (var entry in archive.Entries) { cancellationToken.ThrowIfCancellationRequested(); - var entry = entries.Entry; if (entry.IsDirectory) { var dirPath = Path.Combine(destination, entry.Key.NotNull("Entry Key is null")); @@ -77,7 +75,7 @@ public static class IArchiveExtensions // Write file using var fs = File.OpenWrite(path); - entries.WriteEntryTo(fs); + entry.WriteTo(fs); // Update progress bytesRead += entry.Size; diff --git a/src/SharpCompress/Readers/Rar/RarReader.cs b/src/SharpCompress/Readers/Rar/RarReader.cs index aa73e30f..2a56ee35 100644 --- a/src/SharpCompress/Readers/Rar/RarReader.cs +++ b/src/SharpCompress/Readers/Rar/RarReader.cs @@ -40,6 +40,29 @@ public abstract class RarReader : AbstractReader public override RarVolume? Volume => volume; + public static RarReader Open(string filePath, ReaderOptions? options = null) + { + filePath.CheckNotNullOrEmpty(nameof(filePath)); + return Open(new FileInfo(filePath), options); + } + + public static RarReader Open(FileInfo fileInfo, ReaderOptions? options = null) + { + options ??= new ReaderOptions { LeaveStreamOpen = false }; + return Open(fileInfo.OpenRead(), options); + } + + public static RarReader Open(IEnumerable filePaths, ReaderOptions? options = null) + { + return Open(filePaths.Select(x => new FileInfo(x)), options); + } + + public static RarReader Open(IEnumerable fileInfos, ReaderOptions? options = null) + { + options ??= new ReaderOptions { LeaveStreamOpen = false }; + return Open(fileInfos.Select(x => x.OpenRead()), options); + } + /// /// Opens a RarReader for Non-seeking usage with a single volume /// diff --git a/src/SharpCompress/Readers/ReaderFactory.cs b/src/SharpCompress/Readers/ReaderFactory.cs index fb133d98..9830c8fb 100644 --- a/src/SharpCompress/Readers/ReaderFactory.cs +++ b/src/SharpCompress/Readers/ReaderFactory.cs @@ -9,6 +9,18 @@ namespace SharpCompress.Readers; public static class ReaderFactory { + public static IReader Open(string filePath, ReaderOptions? options = null) + { + filePath.CheckNotNullOrEmpty(nameof(filePath)); + return Open(new FileInfo(filePath), options); + } + + public static IReader Open(FileInfo fileInfo, ReaderOptions? options = null) + { + options ??= new ReaderOptions { LeaveStreamOpen = false }; + return Open(fileInfo.OpenRead(), options); + } + /// /// Opens a Reader for Non-seeking usage /// diff --git a/tests/SharpCompress.Test/ArchiveTests.cs b/tests/SharpCompress.Test/ArchiveTests.cs index 5a3d36ca..9c483c60 100644 --- a/tests/SharpCompress.Test/ArchiveTests.cs +++ b/tests/SharpCompress.Test/ArchiveTests.cs @@ -255,16 +255,10 @@ public class ArchiveTests : ReaderTests protected void ArchiveExtractToDirectory( string testArchive, ReaderOptions? readerOptions = null - ) => ArchiveExtractToDirectory(ArchiveFactory.AutoFactory, testArchive, readerOptions); - - protected void ArchiveExtractToDirectory( - IArchiveFactory archiveFactory, - string testArchive, - ReaderOptions? readerOptions = null ) { testArchive = Path.Combine(TEST_ARCHIVES_PATH, testArchive); - using (var archive = archiveFactory.Open(new FileInfo(testArchive), readerOptions)) + using (var archive = ArchiveFactory.Open(new FileInfo(testArchive), readerOptions)) { archive.ExtractToDirectory(SCRATCH_FILES_PATH); } @@ -342,13 +336,12 @@ public class ArchiveTests : ReaderTests { testArchive = Path.Combine(TEST_ARCHIVES_PATH, testArchive); using var archive = ArchiveFactory.Open(testArchive); - using var reader = archive.ExtractAllEntries(); - while (reader.MoveToNextEntry()) + foreach (var entry in archive.Entries) { - if (!reader.Entry.IsDirectory) + if (!entry.IsDirectory) { var memory = new MemoryStream(); - reader.WriteEntryTo(memory); + entry.WriteTo(memory); memory.Position = 0; diff --git a/tests/SharpCompress.Test/Rar/RarReaderTests.cs b/tests/SharpCompress.Test/Rar/RarReaderTests.cs index 2158adf7..d7c02d2d 100644 --- a/tests/SharpCompress.Test/Rar/RarReaderTests.cs +++ b/tests/SharpCompress.Test/Rar/RarReaderTests.cs @@ -407,10 +407,16 @@ public class RarReaderTests : ReaderTests Path.Combine("exe", "test.exe"), } ); - using var archive = RarArchive.Open( - Path.Combine(TEST_ARCHIVES_PATH, "Rar.multi.part01.rar") + using var reader = RarReader.Open( + [ + Path.Combine(TEST_ARCHIVES_PATH, "Rar.multi.part01.rar"), + Path.Combine(TEST_ARCHIVES_PATH, "Rar.multi.part02.rar"), + Path.Combine(TEST_ARCHIVES_PATH, "Rar.multi.part03.rar"), + Path.Combine(TEST_ARCHIVES_PATH, "Rar.multi.part04.rar"), + Path.Combine(TEST_ARCHIVES_PATH, "Rar.multi.part05.rar"), + Path.Combine(TEST_ARCHIVES_PATH, "Rar.multi.part06.rar"), + ] ); - using var reader = archive.ExtractAllEntries(); while (reader.MoveToNextEntry()) { Assert.Equal(expectedOrder.Pop(), reader.Entry.Key); diff --git a/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs b/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs index e09df7e9..53849e46 100644 --- a/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs +++ b/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs @@ -734,8 +734,7 @@ public class ZipArchiveTests : ArchiveTests { var zipPath = Path.Combine(TEST_ARCHIVES_PATH, "Zip.uncompressed.zip"); using var stream = File.OpenRead(zipPath); - var archive = ArchiveFactory.Open(stream); - var reader = archive.ExtractAllEntries(); + var reader = ReaderFactory.Open(stream); var entries = 0; while (reader.MoveToNextEntry()) { @@ -763,8 +762,7 @@ public class ZipArchiveTests : ArchiveTests }; var zipPath = Path.Combine(TEST_ARCHIVES_PATH, "Zip.uncompressed.zip"); using var stream = File.OpenRead(zipPath); - var archive = ArchiveFactory.Open(stream); - var reader = archive.ExtractAllEntries(); + var reader = ReaderFactory.Open(stream); var x = 0; while (reader.MoveToNextEntry()) { @@ -781,7 +779,7 @@ public class ZipArchiveTests : ArchiveTests var zipPath = Path.Combine(TEST_ARCHIVES_PATH, "Zip.UnicodePathExtra.zip"); using (var stream = File.OpenRead(zipPath)) { - var archive = ArchiveFactory.Open( + var reader = ReaderFactory.Open( stream, new ReaderOptions { @@ -791,13 +789,12 @@ public class ZipArchiveTests : ArchiveTests }, } ); - var reader = archive.ExtractAllEntries(); reader.MoveToNextEntry(); Assert.Equal("궖귛궖귙귪궖귗귪궖귙_wav.frq", reader.Entry.Key); } using (var stream = File.OpenRead(zipPath)) { - var archive = ArchiveFactory.Open( + var reader = ReaderFactory.Open( stream, new ReaderOptions { @@ -807,7 +804,6 @@ public class ZipArchiveTests : ArchiveTests }, } ); - var reader = archive.ExtractAllEntries(); reader.MoveToNextEntry(); Assert.Equal("きょきゅんきゃんきゅ_wav.frq", reader.Entry.Key); } diff --git a/tests/SharpCompress.Test/Zip/ZipReaderTests.cs b/tests/SharpCompress.Test/Zip/ZipReaderTests.cs index 835521e0..118e788d 100644 --- a/tests/SharpCompress.Test/Zip/ZipReaderTests.cs +++ b/tests/SharpCompress.Test/Zip/ZipReaderTests.cs @@ -383,11 +383,10 @@ public class ZipReaderTests : ReaderTests [Fact] public void Zip_Uncompressed_Encrypted_Read() { - using var archive = ArchiveFactory.Open( + using var reader = ReaderFactory.Open( Path.Combine(TEST_ARCHIVES_PATH, "Zip.none.encrypted.zip"), new ReaderOptions { Password = "test" } ); - using var reader = archive.ExtractAllEntries(); reader.MoveToNextEntry(); Assert.Equal("first.txt", reader.Entry.Key); Assert.Equal(199, reader.Entry.Size);