From a24088c89ac15e7beb95ce68a554880bce34caba Mon Sep 17 00:00:00 2001 From: Dennis Ostermann Date: Tue, 16 Jan 2018 11:25:45 +0100 Subject: [PATCH 1/3] Added ArchiveComment Property to ZipArchive --- src/SharpCompress/Archives/Zip/ZipArchive.cs | 3 +++ .../Common/Zip/Headers/DirectoryEntryHeader.cs | 2 +- src/SharpCompress/Common/Zip/SeekableZipHeaderFactory.cs | 7 ++++++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/SharpCompress/Archives/Zip/ZipArchive.cs b/src/SharpCompress/Archives/Zip/ZipArchive.cs index f0889668c..e0f8b2cdd 100644 --- a/src/SharpCompress/Archives/Zip/ZipArchive.cs +++ b/src/SharpCompress/Archives/Zip/ZipArchive.cs @@ -23,6 +23,8 @@ public class ZipArchive : AbstractWritableArchive /// public CompressionLevel DeflateCompressionLevel { get; set; } + public string ArchiveComment { get; private set; } + #if !NO_FILE /// @@ -154,6 +156,7 @@ protected override IEnumerable LoadEntries(IEnumerable ReadSeekableHeader(Stream stream) SeekBackToHeader(stream, reader, DIRECTORY_END_HEADER_BYTES); var entry = new DirectoryEndHeader(); entry.Read(reader); - + var comm = new ArchiveEncoding().Decode(entry.Comment); if (entry.IsZip64) { _zip64 = true; @@ -58,6 +58,11 @@ internal IEnumerable ReadSeekableHeader(Stream stream) yield break; } + if (!string.IsNullOrEmpty(comm)) + { + directoryEntryHeader.Comment = comm; + } + //entry could be zero bytes so we need to know that. directoryEntryHeader.HasData = directoryEntryHeader.CompressedSize != 0; yield return directoryEntryHeader; From 767408ec2102ca31be0b2a6d9bbed54d19f58e3d Mon Sep 17 00:00:00 2001 From: Dennis Ostermann Date: Thu, 18 Jan 2018 11:24:53 +0100 Subject: [PATCH 2/3] Added Test for ArchiveComment --- .../SharpCompress.Test/Zip/ZipArchiveTests.cs | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs b/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs index 031698d84..4b22b8c5e 100644 --- a/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs +++ b/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs @@ -11,7 +11,11 @@ namespace SharpCompress.Test.Zip { - public class ZipArchiveTests : ArchiveTests + using Microsoft.VisualStudio.TestPlatform.ObjectModel; + + using SharpCompress.Writers.Zip; + + public class ZipArchiveTests : ArchiveTests { public ZipArchiveTests() { @@ -461,5 +465,22 @@ public void TestSharpCompressWithEmptyStream() } } } + + [Fact] + public void ReadArchiveComment() + { + string expectedComment = "HelloWorld"; + using (var streamArchive = ZipArchive.Create()) + { + var zipStream = new MemoryStream(); + streamArchive.AddEntry("Dummy", new MemoryStream()); + streamArchive.SaveTo(zipStream, new ZipWriterOptions(CompressionType.Deflate) { ArchiveComment = expectedComment }); + using (var openedArchive = ZipArchive.Open(zipStream)) + { + var entries = openedArchive.Entries.ToList(); + Assert.Equal(expectedComment, openedArchive.ArchiveComment); + } + } + } } } From cc2557d02e375fc9e919a39eb139c1fe72ae9a46 Mon Sep 17 00:00:00 2001 From: Dennis Ostermann Date: Thu, 18 Jan 2018 11:39:22 +0100 Subject: [PATCH 3/3] Moved comment decoding to ZipArchive from SeekableZipHeaderFactory --- src/SharpCompress/Archives/Zip/ZipArchive.cs | 12 +++++++++++- .../Common/Zip/SeekableZipHeaderFactory.cs | 14 +++++++++++--- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/SharpCompress/Archives/Zip/ZipArchive.cs b/src/SharpCompress/Archives/Zip/ZipArchive.cs index e0f8b2cdd..d295c6e66 100644 --- a/src/SharpCompress/Archives/Zip/ZipArchive.cs +++ b/src/SharpCompress/Archives/Zip/ZipArchive.cs @@ -156,7 +156,8 @@ protected override IEnumerable LoadEntries(IEnumerable ReadSeekableHeader(Stream stream) SeekBackToHeader(stream, reader, DIRECTORY_END_HEADER_BYTES); var entry = new DirectoryEndHeader(); entry.Read(reader); - var comm = new ArchiveEncoding().Decode(entry.Comment); + if (entry.IsZip64) { _zip64 = true; @@ -58,9 +58,9 @@ internal IEnumerable ReadSeekableHeader(Stream stream) yield break; } - if (!string.IsNullOrEmpty(comm)) + if (entry.Comment.Length != 0) { - directoryEntryHeader.Comment = comm; + directoryEntryHeader.Comment = ByteArrayToString(entry.Comment); } //entry could be zero bytes so we need to know that. @@ -69,6 +69,14 @@ internal IEnumerable ReadSeekableHeader(Stream stream) } } + internal string ByteArrayToString(byte[] ba) + { + StringBuilder hex = new StringBuilder(ba.Length * 2); + foreach (byte b in ba) + hex.AppendFormat("{0:x2}", b); + return hex.ToString(); + } + private static void SeekBackToHeader(Stream stream, BinaryReader reader, uint headerSignature) { long offset = 0;