Return the per-file header as a bytes object. When the optional zip64 arg is None rather than a bool, we will decide based upon the file_size and compress_size, if known, False otherwise.
(self, zip64=None)
| 516 | return ''.join(result) |
| 517 | |
| 518 | def FileHeader(self, zip64=None): |
| 519 | """Return the per-file header as a bytes object. |
| 520 | |
| 521 | When the optional zip64 arg is None rather than a bool, we will |
| 522 | decide based upon the file_size and compress_size, if known, |
| 523 | False otherwise. |
| 524 | """ |
| 525 | dt = self.date_time |
| 526 | dosdate = (dt[0] - 1980) << 9 | dt[1] << 5 | dt[2] |
| 527 | dostime = dt[3] << 11 | dt[4] << 5 | (dt[5] // 2) |
| 528 | if self.flag_bits & _MASK_USE_DATA_DESCRIPTOR: |
| 529 | # Set these to zero because we write them after the file data |
| 530 | CRC = compress_size = file_size = 0 |
| 531 | else: |
| 532 | CRC = self.CRC |
| 533 | compress_size = self.compress_size |
| 534 | file_size = self.file_size |
| 535 | |
| 536 | extra = self.extra |
| 537 | |
| 538 | min_version = 0 |
| 539 | if zip64 is None: |
| 540 | # We always explicitly pass zip64 within this module.... This |
| 541 | # remains for anyone using ZipInfo.FileHeader as a public API. |
| 542 | zip64 = file_size > ZIP64_LIMIT or compress_size > ZIP64_LIMIT |
| 543 | if zip64: |
| 544 | fmt = '<HHQQ' |
| 545 | extra = extra + struct.pack(fmt, |
| 546 | 1, struct.calcsize(fmt)-4, file_size, compress_size) |
| 547 | file_size = 0xffffffff |
| 548 | compress_size = 0xffffffff |
| 549 | min_version = ZIP64_VERSION |
| 550 | |
| 551 | if self.compress_type == ZIP_BZIP2: |
| 552 | min_version = max(BZIP2_VERSION, min_version) |
| 553 | elif self.compress_type == ZIP_LZMA: |
| 554 | min_version = max(LZMA_VERSION, min_version) |
| 555 | elif self.compress_type == ZIP_ZSTANDARD: |
| 556 | min_version = max(ZSTANDARD_VERSION, min_version) |
| 557 | |
| 558 | self.extract_version = max(min_version, self.extract_version) |
| 559 | self.create_version = max(min_version, self.create_version) |
| 560 | filename, flag_bits = self._encodeFilenameFlags() |
| 561 | header = struct.pack(structFileHeader, stringFileHeader, |
| 562 | self.extract_version, self.reserved, flag_bits, |
| 563 | self.compress_type, dostime, dosdate, CRC, |
| 564 | compress_size, file_size, |
| 565 | len(filename), len(extra)) |
| 566 | return header + filename + extra |
| 567 | |
| 568 | def _encodeFilenameFlags(self): |
| 569 | try: |
no test coverage detected