diff --git a/SharpCompress.sln.DotSettings b/SharpCompress.sln.DotSettings index 4ff50910..e2f7e87f 100644 --- a/SharpCompress.sln.DotSettings +++ b/SharpCompress.sln.DotSettings @@ -15,17 +15,17 @@ Basic Clean True - Named + Positional Required Required Required Required - True + False True True - True + False True - True + False True True True @@ -42,7 +42,7 @@ ALWAYS_ADD ALWAYS_ADD ALWAYS_ADD - True + False 1 1 NEVER @@ -50,12 +50,12 @@ False False NEVER - True + False False NEVER - True + False - True + False LINE_BREAK False @@ -67,13 +67,13 @@ False False CHOP_IF_LONG - CHOP_IF_LONG + CHOP_ALWAYS CHOP_IF_LONG False CHOP_IF_LONG - UseVarWhenEvident - UseVarWhenEvident - UseVarWhenEvident + UseVar + UseVar + UseVar <Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb" /> <Policy Inspect="True" Prefix="" Suffix="" Style="AA_BB" /> @@ -122,6 +122,7 @@ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + True True True diff --git a/src/SharpCompress/Archives/Zip/ZipArchiveEntry.cs b/src/SharpCompress/Archives/Zip/ZipArchiveEntry.cs index f13faee7..4c980f91 100644 --- a/src/SharpCompress/Archives/Zip/ZipArchiveEntry.cs +++ b/src/SharpCompress/Archives/Zip/ZipArchiveEntry.cs @@ -18,6 +18,4 @@ public class ZipArchiveEntry : ZipEntry, IArchiveEntry public bool IsComplete => true; #endregion - - public string? Comment => ((SeekableZipFilePart)Parts.Single()).Comment; } diff --git a/src/SharpCompress/Common/Zip/Headers/DirectoryEntryHeader.cs b/src/SharpCompress/Common/Zip/Headers/DirectoryEntryHeader.cs index 2b26d298..6ca248e4 100644 --- a/src/SharpCompress/Common/Zip/Headers/DirectoryEntryHeader.cs +++ b/src/SharpCompress/Common/Zip/Headers/DirectoryEntryHeader.cs @@ -128,6 +128,4 @@ internal class DirectoryEntryHeader : ZipFileEntry public ushort InternalFileAttributes { get; set; } public ushort DiskNumberStart { get; set; } - - public string? Comment { get; private set; } } diff --git a/src/SharpCompress/Common/Zip/Headers/ZipFileEntry.cs b/src/SharpCompress/Common/Zip/Headers/ZipFileEntry.cs index 0570bf6d..6842cba6 100644 --- a/src/SharpCompress/Common/Zip/Headers/ZipFileEntry.cs +++ b/src/SharpCompress/Common/Zip/Headers/ZipFileEntry.cs @@ -120,4 +120,6 @@ internal abstract class ZipFileEntry : ZipHeader internal ZipFilePart? Part { get; set; } internal bool IsZip64 => CompressedSize >= uint.MaxValue; + + internal string? Comment { get; set; } } diff --git a/src/SharpCompress/Common/Zip/SeekableZipFilePart.cs b/src/SharpCompress/Common/Zip/SeekableZipFilePart.cs index 54c4f527..e7572711 100644 --- a/src/SharpCompress/Common/Zip/SeekableZipFilePart.cs +++ b/src/SharpCompress/Common/Zip/SeekableZipFilePart.cs @@ -25,14 +25,8 @@ internal class SeekableZipFilePart : ZipFilePart return base.GetCompressedStream(); } - internal string? Comment => ((DirectoryEntryHeader)Header).Comment; - - private void LoadLocalHeader() - { - var hasData = Header.HasData; - Header = _headerFactory.GetLocalHeader(BaseStream, ((DirectoryEntryHeader)Header)); - Header.HasData = hasData; - } + private void LoadLocalHeader() => + Header = _headerFactory.GetLocalHeader(BaseStream, (DirectoryEntryHeader)Header); protected override Stream CreateBaseStream() { diff --git a/src/SharpCompress/Common/Zip/SeekableZipHeaderFactory.cs b/src/SharpCompress/Common/Zip/SeekableZipHeaderFactory.cs index 816b0b67..e610c080 100644 --- a/src/SharpCompress/Common/Zip/SeekableZipHeaderFactory.cs +++ b/src/SharpCompress/Common/Zip/SeekableZipHeaderFactory.cs @@ -149,6 +149,11 @@ internal sealed class SeekableZipHeaderFactory : ZipHeaderFactory { throw new InvalidOperationException(); } + + // populate fields only known from the DirectoryEntryHeader + localEntryHeader.HasData = directoryEntryHeader.HasData; + localEntryHeader.Comment = directoryEntryHeader.Comment; + if (FlagUtility.HasFlag(localEntryHeader.Flags, HeaderFlags.UsePostDataDescriptor)) { localEntryHeader.Crc = directoryEntryHeader.Crc; diff --git a/src/SharpCompress/Common/Zip/ZipEntry.cs b/src/SharpCompress/Common/Zip/ZipEntry.cs index d8e947f8..c0b677d7 100644 --- a/src/SharpCompress/Common/Zip/ZipEntry.cs +++ b/src/SharpCompress/Common/Zip/ZipEntry.cs @@ -83,4 +83,6 @@ public class ZipEntry : Entry public override bool IsSplitAfter => false; internal override IEnumerable Parts => _filePart.Empty(); + + public string? Comment => _filePart?.Header.Comment; } diff --git a/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs b/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs index e678f29b..8b886afe 100644 --- a/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs +++ b/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs @@ -820,4 +820,16 @@ public class ZipArchiveTests : ArchiveTests using var _ = firstEntry.OpenEntryStream(); Assert.Equal(199, firstEntry.Size); } + + [Fact] + public void Zip_EntryCommentAfterEntryRead() + { + using var archive = ZipArchive.Open( + Path.Combine(TEST_ARCHIVES_PATH, "Zip.EntryComment.zip") + ); + var firstEntry = archive.Entries.First(); + Assert.Equal(29, firstEntry.Comment!.Length); + using var _ = firstEntry.OpenEntryStream(); + Assert.Equal(29, firstEntry.Comment.Length); + } } diff --git a/tests/TestArchives/Archives/Zip.EntryComment.zip b/tests/TestArchives/Archives/Zip.EntryComment.zip new file mode 100644 index 00000000..7e4ab419 Binary files /dev/null and b/tests/TestArchives/Archives/Zip.EntryComment.zip differ