This issue tracker has been migrated to GitHub ,
and is currently read-only.
For more information,
see the GitHub FAQs in the Python's Developer Guide.
Created on 2003年02月04日 01:54 by laurelboa, last changed 2022年04月10日 16:06 by admin. This issue is now closed.
| Messages (2) | |||
|---|---|---|---|
| msg14417 - (view) | Author: Jimmy Burgett (laurelboa) | Date: 2003年02月04日 01:54 | |
Python 2.2.2 Windows XP (all serice packs installed) Windows 2000 (all service packs installed) The filesize and compressed file size numbers in the zip header need to "struct.packed" as unsigned ints, not signed ints. This allows zipfile.py to compress files greater than 2 gigabytes in size. Currently, an attempt to compress such a large file gives you this error: Traceback (most recent call last): File "<interactive input>", line 1, in ? File "C:\Python22\lib\zipfile.py", line 426, in write zinfo.file_size)) OverflowError: long int too large to convert to int where the line in question is: self.fp.write(struct.pack("<lll", zinfo.CRC, zinfo.compress_size, zinfo.file_size)) I believe that the four changes below are all that is needed. This is from version 2.2.2, but zipfile.py in 2.3a1 still had the file size packed/unpacked as a signed integer. I have not tested whether the ziplib routines can seek past the 2 gig boundary in order to extract a file whose beginning is past the 2 gig boundary. My application requires compressing very large files one at a time and zipfile.py lets me use either WinZip or the built-in Windows "unzip" function for extraction. These changes allow that use. -------------- Change Line #28 # Here are some struct module formats for reading headers structEndArchive = "<4s4H2lH" # 9 items, end of archive, 22 bytes stringEndArchive = "PK005円006円" # magic number for end of archive record structCentralDir = "<4s4B4H3l5H2l"# 19 items, central directory, 46 bytes to structCentralDir = "<4s4B4HlLL5H2L"# 19 items, central directory, 46 bytes --------------- change line #306 def printdir(self): """Print a table of contents for the zip file.""" print "%-46s %19s %12s" % ("File Name", "Modified ", "Size") for zinfo in self.filelist: date = "%d-%02d-%02d %02d:%02d:%02d" % zinfo.date_time print "%-46s %s %12d" % (zinfo.filename, date, zinfo.file_size) to print "%-46s %s %12u" % (zinfo.filename, date, zinfo.file_size) ---------------- change line #425 # Seek backwards and write CRC and file sizes position = self.fp.tell() # Preserve current position in file self.fp.seek(zinfo.header_offset + 14, 0) self.fp.write(struct.pack("<lll", zinfo.CRC, zinfo.compress_size, zinfo.file_size)) to self.fp.write(struct.pack("<lLL", zinfo.CRC, zinfo.compress_size, zinfo.file_size)) ---------------- change line #450 if zinfo.flag_bits & 0x08: # Write CRC and file sizes after the file data self.fp.write(struct.pack("<lll", zinfo.CRC, zinfo.compress_size, zinfo.file_size)) to self.fp.write(struct.pack("<lLL", zinfo.CRC, zinfo.compress_size, zinfo.file_size)) |
|||
| msg14418 - (view) | Author: Brett Cannon (brett.cannon) * (Python committer) | Date: 2004年07月10日 19:20 | |
Logged In: YES user_id=357491 Fixed in rev. 1.33 for Python 2.4.a2 and rev. 1.31.8.1 for Python 2.3.5 . Thanks, Jimmy. Just added to your fixes but they did help. |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月10日 16:06:29 | admin | set | github: 37903 |
| 2003年02月04日 01:54:29 | laurelboa | create | |