From cd3cbd2b3272f002693aad84a79da145604e9618 Mon Sep 17 00:00:00 2001 From: Kenneth Skovhede Date: Thu, 9 Mar 2017 23:18:57 +0100 Subject: [PATCH] Support for writing zip64 headers in the unused code --- .../Zip/Headers/DirectoryEntryHeader.cs | 32 +++++++++++++---- .../Common/Zip/Headers/LocalEntryHeader.cs | 35 ++++++++++++++++--- 2 files changed, 57 insertions(+), 10 deletions(-) diff --git a/src/SharpCompress/Common/Zip/Headers/DirectoryEntryHeader.cs b/src/SharpCompress/Common/Zip/Headers/DirectoryEntryHeader.cs index 3b50d118..b7d3d5c7 100644 --- a/src/SharpCompress/Common/Zip/Headers/DirectoryEntryHeader.cs +++ b/src/SharpCompress/Common/Zip/Headers/DirectoryEntryHeader.cs @@ -63,6 +63,10 @@ namespace SharpCompress.Common.Zip.Headers internal override void Write(BinaryWriter writer) { + var zip64 = CompressedSize >= uint.MaxValue || UncompressedSize >= uint.MaxValue || RelativeOffsetOfEntryHeader >= uint.MaxValue; + if (zip64) + Version = (ushort)(Version > 45 ? Version : 45); + writer.Write(Version); writer.Write(VersionNeededToExtract); writer.Write((ushort)Flags); @@ -70,24 +74,40 @@ namespace SharpCompress.Common.Zip.Headers writer.Write(LastModifiedTime); writer.Write(LastModifiedDate); writer.Write(Crc); - writer.Write((uint)CompressedSize); - writer.Write((uint)UncompressedSize); + writer.Write(zip64 ? uint.MaxValue : CompressedSize); + writer.Write(zip64 ? uint.MaxValue : UncompressedSize); byte[] nameBytes = EncodeString(Name); writer.Write((ushort)nameBytes.Length); - //writer.Write((ushort)Extra.Length); - writer.Write((ushort)0); + if (zip64) + { + writer.Write((ushort)(2 + 2 + 8 + 8 + 8 + 4)); + } + else + { + //writer.Write((ushort)Extra.Length); + writer.Write((ushort)0); + } writer.Write((ushort)Comment.Length); writer.Write(DiskNumberStart); writer.Write(InternalFileAttributes); writer.Write(ExternalFileAttributes); - writer.Write(RelativeOffsetOfEntryHeader); + writer.Write(zip64 ? uint.MaxValue : RelativeOffsetOfEntryHeader); writer.Write(nameBytes); - // writer.Write(Extra); + if (zip64) + { + writer.Write((ushort)0x0001); + writer.Write((ushort)((8 + 8 + 8 + 4))); + + writer.Write((ulong)UncompressedSize); + writer.Write((ulong)CompressedSize); + writer.Write((ulong)RelativeOffsetOfEntryHeader); + writer.Write((uint)0); // VolumeNumber = 0 + } writer.Write(Comment); } diff --git a/src/SharpCompress/Common/Zip/Headers/LocalEntryHeader.cs b/src/SharpCompress/Common/Zip/Headers/LocalEntryHeader.cs index 2e311cc8..fe539406 100644 --- a/src/SharpCompress/Common/Zip/Headers/LocalEntryHeader.cs +++ b/src/SharpCompress/Common/Zip/Headers/LocalEntryHeader.cs @@ -49,25 +49,52 @@ namespace SharpCompress.Common.Zip.Headers internal override void Write(BinaryWriter writer) { - writer.Write(Version); + if (IsZip64) + Version = (ushort)(Version > 45 ? Version : 45); + + writer.Write(Version); + writer.Write((ushort)Flags); writer.Write((ushort)CompressionMethod); writer.Write(LastModifiedTime); writer.Write(LastModifiedDate); writer.Write(Crc); - writer.Write((uint)CompressedSize); - writer.Write((uint)UncompressedSize); + + if (IsZip64) + { + writer.Write(uint.MaxValue); + writer.Write(uint.MaxValue); + } + else + { + writer.Write(CompressedSize); + writer.Write(UncompressedSize); + } byte[] nameBytes = EncodeString(Name); writer.Write((ushort)nameBytes.Length); - writer.Write((ushort)0); + if (IsZip64) + { + writer.Write((ushort)(2 + 2 + (2 * 8))); + } + else + { + writer.Write((ushort)0); + } //if (Extra != null) //{ // writer.Write(Extra); //} writer.Write(nameBytes); + if (IsZip64) + { + writer.Write((ushort)0x0001); + writer.Write((ushort)(2 * 8)); + writer.Write((ulong)CompressedSize); + writer.Write((ulong)UncompressedSize); + } } internal ushort Version { get; private set; }