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
}