'Return the per-file header as a string.'

def FileHeader(self, zip64=None):

    dt = self.date_time
    dosdate = ((((dt[0] - 1980) << 9) | (dt[1] << 5)) | dt[2])
    dostime = (((dt[3] << 11) | (dt[4] << 5)) | (dt[5] // 2))
    if (self.flag_bits & 8):
        CRC = compress_size = file_size = 0
    else:
        CRC = self.CRC
        compress_size = self.compress_size
        file_size = self.file_size
    extra = self.extra
    if (zip64 is None):
        zip64 = ((file_size > ZIP64_LIMIT) or (compress_size > ZIP64_LIMIT))
    if zip64:
        fmt = '<HHQQ'
        extra = (extra + struct.pack(fmt, 1, (struct.calcsize(fmt) - 4), file_size, compress_size))
    if ((file_size > ZIP64_LIMIT) or (compress_size > ZIP64_LIMIT)):
        if (not zip64):
            raise LargeZipFile('Filesize    would    require    ZIP64    extensions')
        file_size = 4294967295
        compress_size = 4294967295
        self.extract_version = max(45, self.extract_version)
        self.create_version = max(45, self.extract_version)
    (filename, flag_bits) = self._encodeFilenameFlags()
    header = struct.pack(structFileHeader, stringFileHeader, self.extract_version, self.reserved, flag_bits, self.compress_type, dostime, dosdate, CRC, compress_size, file_size, len(filename), len(extra))
    return ((header + filename) + extra)
