From 53393e744e3ed79df30e724774092f86f3b9df0f Mon Sep 17 00:00:00 2001 From: Brendan Grant Date: Sat, 13 Feb 2021 13:33:43 -0600 Subject: [PATCH 1/2] Supporting reading contents of incomplete files --- src/SharpCompress/Archives/Rar/RarArchive.cs | 5 +++-- src/SharpCompress/Archives/Rar/RarArchiveEntry.cs | 7 +++++-- src/SharpCompress/Archives/Rar/RarArchiveEntryFactory.cs | 6 ++++-- src/SharpCompress/Readers/ReaderOptions.cs | 2 ++ 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/SharpCompress/Archives/Rar/RarArchive.cs b/src/SharpCompress/Archives/Rar/RarArchive.cs index b71b21478..0b191056d 100644 --- a/src/SharpCompress/Archives/Rar/RarArchive.cs +++ b/src/SharpCompress/Archives/Rar/RarArchive.cs @@ -10,7 +10,8 @@ namespace SharpCompress.Archives.Rar { - public class RarArchive : AbstractArchive + public class + RarArchive : AbstractArchive { internal Lazy UnpackV2017 { get; } = new Lazy(() => new SharpCompress.Compressors.Rar.UnpackV2017.Unpack()); internal Lazy UnpackV1 { get; } = new Lazy(() => new SharpCompress.Compressors.Rar.UnpackV1.Unpack()); @@ -42,7 +43,7 @@ internal RarArchive(IEnumerable streams, ReaderOptions options) protected override IEnumerable LoadEntries(IEnumerable volumes) { - return RarArchiveEntryFactory.GetEntries(this, volumes); + return RarArchiveEntryFactory.GetEntries(this, volumes, ReaderOptions); } protected override IEnumerable LoadVolumes(IEnumerable streams) diff --git a/src/SharpCompress/Archives/Rar/RarArchiveEntry.cs b/src/SharpCompress/Archives/Rar/RarArchiveEntry.cs index eee9d9964..c695a8b97 100644 --- a/src/SharpCompress/Archives/Rar/RarArchiveEntry.cs +++ b/src/SharpCompress/Archives/Rar/RarArchiveEntry.cs @@ -6,6 +6,7 @@ using SharpCompress.Common.Rar; using SharpCompress.Common.Rar.Headers; using SharpCompress.Compressors.Rar; +using SharpCompress.Readers; namespace SharpCompress.Archives.Rar { @@ -13,11 +14,13 @@ public class RarArchiveEntry : RarEntry, IArchiveEntry { private readonly ICollection parts; private readonly RarArchive archive; + private readonly ReaderOptions readerOptions; - internal RarArchiveEntry(RarArchive archive, IEnumerable parts) + internal RarArchiveEntry(RarArchive archive, IEnumerable parts, ReaderOptions readerOptions) { this.parts = parts.ToList(); this.archive = archive; + this.readerOptions = readerOptions; } public override CompressionType CompressionType => CompressionType.Rar; @@ -75,7 +78,7 @@ public bool IsComplete private void CheckIncomplete() { - if (!IsComplete) + if (!readerOptions.DisableCheckIncomplete && !IsComplete) { throw new IncompleteArchiveException("ArchiveEntry is incomplete and cannot perform this operation."); } diff --git a/src/SharpCompress/Archives/Rar/RarArchiveEntryFactory.cs b/src/SharpCompress/Archives/Rar/RarArchiveEntryFactory.cs index e41c024dc..2d471c18a 100644 --- a/src/SharpCompress/Archives/Rar/RarArchiveEntryFactory.cs +++ b/src/SharpCompress/Archives/Rar/RarArchiveEntryFactory.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using SharpCompress.Common.Rar; +using SharpCompress.Readers; namespace SharpCompress.Archives.Rar { @@ -36,11 +37,12 @@ private static IEnumerable> GetMatchedFileParts(IEnumer } internal static IEnumerable GetEntries(RarArchive archive, - IEnumerable rarParts) + IEnumerable rarParts, + ReaderOptions readerOptions) { foreach (var groupedParts in GetMatchedFileParts(rarParts)) { - yield return new RarArchiveEntry(archive, groupedParts); + yield return new RarArchiveEntry(archive, groupedParts, readerOptions); } } } diff --git a/src/SharpCompress/Readers/ReaderOptions.cs b/src/SharpCompress/Readers/ReaderOptions.cs index 15302dc27..110b0c331 100644 --- a/src/SharpCompress/Readers/ReaderOptions.cs +++ b/src/SharpCompress/Readers/ReaderOptions.cs @@ -10,5 +10,7 @@ public class ReaderOptions : OptionsBase public bool LookForHeader { get; set; } public string? Password { get; set; } + + public bool DisableCheckIncomplete { get; set; } } } \ No newline at end of file From 5b86c40d5b8ff493e701b9b8170b934b6451cc56 Mon Sep 17 00:00:00 2001 From: Brendan Grant Date: Sat, 13 Feb 2021 13:34:57 -0600 Subject: [PATCH 2/2] Properly detect if RAR is complete at the end or not --- src/SharpCompress/Archives/Rar/RarArchiveEntry.cs | 2 +- src/SharpCompress/Common/Rar/Headers/FileHeader.cs | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/SharpCompress/Archives/Rar/RarArchiveEntry.cs b/src/SharpCompress/Archives/Rar/RarArchiveEntry.cs index c695a8b97..dbdbd8064 100644 --- a/src/SharpCompress/Archives/Rar/RarArchiveEntry.cs +++ b/src/SharpCompress/Archives/Rar/RarArchiveEntry.cs @@ -72,7 +72,7 @@ public bool IsComplete { get { - return parts.Select(fp => fp.FileHeader).Any(fh => !fh.IsSplitAfter); + return parts.Select(fp => fp.FileHeader).Any(fh => !fh.IsSplitBefore && !fh.IsSplitAfter); } } diff --git a/src/SharpCompress/Common/Rar/Headers/FileHeader.cs b/src/SharpCompress/Common/Rar/Headers/FileHeader.cs index 11d7883f3..2c361a09c 100644 --- a/src/SharpCompress/Common/Rar/Headers/FileHeader.cs +++ b/src/SharpCompress/Common/Rar/Headers/FileHeader.cs @@ -437,6 +437,7 @@ internal uint FileCrc internal long DataStartPosition { get; set; } public Stream PackedStream { get; set; } + public bool IsSplitBefore => IsRar5 ? HasHeaderFlag(HeaderFlagsV5.SPLIT_BEFORE) : HasFlag(FileFlagsV4.SPLIT_BEFORE); public bool IsSplitAfter => IsRar5 ? HasHeaderFlag(HeaderFlagsV5.SPLIT_AFTER) : HasFlag(FileFlagsV4.SPLIT_AFTER); public bool IsDirectory => HasFlag(IsRar5 ? FileFlagsV5.DIRECTORY : FileFlagsV4.DIRECTORY);