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)
| 437 | return ''.join(result) |
| 438 | |
| 439 | def FileHeader(self, zip64=None): |
| 440 | """Return the per-file header as a bytes object. |
| 441 | |
| 442 | When the optional zip64 arg is None rather than a bool, we will |
| 443 | decide based upon the file_size and compress_size, if known, |
| 444 | False otherwise. |
| 445 | """ |
| 446 | dt = self.date_time |
| 447 | dosdate = (dt[0] - 1980) << 9 | dt[1] << 5 | dt[2] |
| 448 | dostime = dt[3] << 11 | dt[4] << 5 | (dt[5] // 2) |
| 449 | if self.flag_bits & _MASK_USE_DATA_DESCRIPTOR: |
| 450 | # Set these to zero because we write them after the file data |
| 451 | CRC = compress_size = file_size = 0 |
| 452 | else: |
| 453 | CRC = self.CRC |
| 454 | compress_size = self.compress_size |
| 455 | file_size = self.file_size |
| 456 | |
| 457 | extra = self.extra |
| 458 | |
| 459 | min_version = 0 |
| 460 | if zip64 is None: |
| 461 | # We always explicitly pass zip64 within this module.... This |
| 462 | # remains for anyone using ZipInfo.FileHeader as a public API. |
| 463 | zip64 = file_size > ZIP64_LIMIT or compress_size > ZIP64_LIMIT |
| 464 | if zip64: |
| 465 | fmt = '<HHQQ' |
| 466 | extra = extra + struct.pack(fmt, |
| 467 | 1, struct.calcsize(fmt)-4, file_size, compress_size) |
| 468 | file_size = 0xffffffff |
| 469 | compress_size = 0xffffffff |
| 470 | min_version = ZIP64_VERSION |
| 471 | |
| 472 | if self.compress_type == ZIP_BZIP2: |
| 473 | min_version = max(BZIP2_VERSION, min_version) |
| 474 | elif self.compress_type == ZIP_LZMA: |
| 475 | min_version = max(LZMA_VERSION, min_version) |
| 476 | |
| 477 | self.extract_version = max(min_version, self.extract_version) |
| 478 | self.create_version = max(min_version, self.create_version) |
| 479 | filename, flag_bits = self._encodeFilenameFlags() |
| 480 | header = struct.pack(structFileHeader, stringFileHeader, |
| 481 | self.extract_version, self.reserved, flag_bits, |
| 482 | self.compress_type, dostime, dosdate, CRC, |
| 483 | compress_size, file_size, |
| 484 | len(filename), len(extra)) |
| 485 | return header + filename + extra |
| 486 | |
| 487 | def _encodeFilenameFlags(self): |
| 488 | try: |
no test coverage detected