Here is a UNIX diff of original 2.6 zipfile.py and one that works with pys60:
Code:
655c655
< def __init__(self, file, mode="r", compression=ZIP_STORED, allowZip64=False):
---
> def __init__(self, mfile, mode="r", compression=ZIP_STORED, allowZip64=False):
680c680
< if isinstance(file, basestring):
---
> if (type(mfile) == type("")) or (type(mfile) == type(u"")) or (type(mfile) == type('')):
682c682
< self.filename = file
---
> self.filename = mfile
685c685
< self.fp = open(file, modeDict[mode])
---
> self.fp = open(mfile, modeDict[mode])
689c689
< self.fp = open(file, modeDict[mode])
---
> self.fp = open(mfile, modeDict[mode])
695c695
< self.filename = getattr(file, 'name', None)
---
> self.filename = getattr(mfile, 'name', None)
Since I hate UNIX diff, here is the modified __init__ method of the ZipFile class that needs to be replaced in the 2.6 module:
Code:
def __init__(self, mfile, mode="r", compression=ZIP_STORED, allowZip64=False):
"""Open the ZIP file with mode read "r", write "w" or append "a"."""
if mode not in ("r", "w", "a"):
raise RuntimeError('ZipFile() requires mode "r", "w", or "a"')
if compression == ZIP_STORED:
pass
elif compression == ZIP_DEFLATED:
if not zlib:
raise RuntimeError,\
"Compression requires the (missing) zlib module"
else:
raise RuntimeError, "That compression method is not supported"
self._allowZip64 = allowZip64
self._didModify = False
self.debug = 0 # Level of printing: 0 through 3
self.NameToInfo = {} # Find file info given name
self.filelist = [] # List of ZipInfo instances for archive
self.compression = compression # Method of compression
self.mode = key = mode.replace('b', '')[0]
self.pwd = None
self.comment = ''
# Check if we were passed a file-like object
if (type(mfile) == type("")) or (type(mfile) == type(u"")) or (type(mfile) == type('')):
self._filePassed = 0
self.filename = mfile
modeDict = {'r' : 'rb', 'w': 'wb', 'a' : 'r+b'}
try:
self.fp = open(mfile, modeDict[mode])
except IOError:
if mode == 'a':
mode = key = 'w'
self.fp = open(mfile, modeDict[mode])
else:
raise
else:
self._filePassed = 1
self.fp = file
self.filename = getattr(mfile, 'name', None)
if key == 'r':
self._GetContents()
elif key == 'w':
pass
elif key == 'a':
try: # See if file is a zip file
self._RealGetContents()
# seek to start of directory and overwrite
self.fp.seek(self.start_dir, 0)
except BadZipfile: # file is not a zip file, just append
self.fp.seek(0, 2)
else:
if not self._filePassed:
self.fp.close()
self.fp = None
raise RuntimeError, 'Mode must be "r", "w" or "a"'
Hope it helps.
Raf