internal void WriteArchiveDirectoryEntryToStream(Stream writer)
{
// File header (in central directory):
//
// central file header signature 4 bytes (0x02014b50)
// version made by 2 bytes
// 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 comment length 2 bytes
// disk number start 2 bytes
// internal file attributes 2 bytes
// external file attributes 4 bytes
// relative offset of local header 4 bytes
//
// file name (variable size)
// extra field (variable size)
// file comment (variable size)
byte[] fileNameBytes = Encoding.UTF8.GetBytes(_name);
ByteBuffer header = new ByteBuffer(46);
header.WriteUInt32(SignatureArchiveDirectory);
header.WriteUInt16(VersionMadeBy);
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);
header.WriteUInt16(FileCommentLength);
header.WriteUInt16(DiskNumberStart);
header.WriteUInt16(InternalFileAttributes);
header.WriteUInt32(ExternalFileAttributes);
header.WriteUInt32(_headerOffset);
header.WriteContentsTo(writer);
writer.Write(fileNameBytes, 0, fileNameBytes.Length);
}