System.IO.Compression.ZipArchiveFile.WriteZipFileHeader C# (CSharp) Method

WriteZipFileHeader() private method

Writes the Zip file header to the stream.
private WriteZipFileHeader ( Stream writer ) : void
writer Stream Stream to write to.
return void
        private void WriteZipFileHeader(Stream writer)
        {
            byte[] fileNameBytes = Encoding.UTF8.GetBytes(_name.Replace(Path.DirectorySeparatorChar, '/'));
            if ((uint)_length != _length)
            {
                throw new InvalidOperationException("File length too long.");
            }

            // Local file header:
            //
            // local file header signature     4 bytes  (0x04034b50)
            // version needed to extract       2 bytes
            // general purpose bit flag        2 bytes
            // compression method              2 bytes
            // last mod file time              2 bytes
            // last mod file date              2 bytes
            // crc-32                          4 bytes
            // compressed size                 4 bytes
            // uncompressed size               4 bytes
            // file name length                2 bytes
            // extra field length              2 bytes
            //
            // file name (variable size)
            // extra field (variable size)

            // Save the start of the header file for later use in the dir entry
            _headerOffset = (uint)writer.Position;

            ByteBuffer header = new ByteBuffer(30);
            header.WriteUInt32(SignatureFileEntry);
            header.WriteUInt16(VersionNeededToExtract);
            header.WriteUInt16(GeneralPurposeBitFlag);
            header.WriteUInt16((ushort)_compressionMethod);
            header.WriteUInt32(DateTimeToDosTime(_lastWriteTime));
            header.WriteUInt32(CheckSum);
            header.WriteUInt32((uint)_compressedLength);
            header.WriteUInt32((uint)Length);
            header.WriteUInt16((ushort)fileNameBytes.Length);
            header.WriteUInt16(ExtraFieldLength);                                 // extra field length (unused)

            header.WriteContentsTo(writer);

            writer.Write(fileNameBytes, 0, fileNameBytes.Length);                // write the archiveFile name
        }