* crc problemi icin pylzma.compressobj implement edilene kadar dosya bir kerede okunsun

* archive zipfileext kullansin, default 7ZIP olsun
This commit is contained in:
Faik Uygur
2006-04-13 20:46:33 +00:00
parent e8cd811120
commit 2d38eb235a
2 changed files with 89 additions and 13 deletions
+4 -4
View File
@@ -17,7 +17,7 @@ import os
import stat import stat
import shutil import shutil
import tarfile import tarfile
import zipfile import zipfileext
import gettext import gettext
__trans = gettext.translation('pisi', fallback=True) __trans = gettext.translation('pisi', fallback=True)
@@ -105,7 +105,7 @@ class ArchiveZip(ArchiveBase):
def __init__(self, file_path, arch_type = "zip", mode = 'r'): def __init__(self, file_path, arch_type = "zip", mode = 'r'):
super(ArchiveZip, self).__init__(file_path, arch_type) super(ArchiveZip, self).__init__(file_path, arch_type)
self.zip_obj = zipfile.ZipFile(self.file_path, mode) self.zip_obj = zipfileext.ZipFileExt(self.file_path, mode)
def close(self): def close(self):
"""Close the zip archive.""" """Close the zip archive."""
@@ -124,13 +124,13 @@ class ArchiveZip(ArchiveBase):
else: else:
if os.path.islink(file_name): if os.path.islink(file_name):
dest = os.readlink(file_name) dest = os.readlink(file_name)
attr = zipfile.ZipInfo() attr = zipfileext.ZipInfo()
attr.filename = file_name attr.filename = file_name
attr.create_system = 3 attr.create_system = 3
attr.external_attr = self.symmagic attr.external_attr = self.symmagic
self.zip_obj.writestr(attr, dest) self.zip_obj.writestr(attr, dest)
else: else:
self.zip_obj.write(file_name, file_name, zipfile.ZIP_DEFLATED) self.zip_obj.write(file_name, file_name, zipfileext.ZIP_7ZIP)
zinfo = self.zip_obj.getinfo(file_name) zinfo = self.zip_obj.getinfo(file_name)
zinfo.create_system = 3 zinfo.create_system = 3
+85 -9
View File
@@ -90,6 +90,84 @@ class SevenZipFileEntry:
self.finished = 1 self.finished = 1
del self.fp del self.fp
class ZipFileEntry:
"""File-like object used to read an uncompressed entry in a ZipFile"""
def __init__(self, fp, length):
self.fp = fp
self.readBytes = 0
self.length = length
self.finished = 0
def tell(self):
return self.readBytes
def read(self, n=None):
if n is None:
n = self.length - self.readBytes
if n == 0 or self.finished:
return ''
data = self.fp.read(n)
self.readBytes += len(data)
if self.readBytes == self.length or len(data) < n:
self.finished = 1
return data
def close(self):
self.finished = 1
del self.fp
class DeflatedZipFileEntry:
"""File-like object used to read a deflated entry in a ZipFile"""
def __init__(self, fp, length):
self.fp = fp
self.returnedBytes = 0
self.readBytes = 0
self.decomp = zlib.decompressobj(-15)
self.buffer = ""
self.length = length
self.finished = 0
def tell(self):
return self.returnedBytes
def read(self, n=None):
if self.finished:
return ""
if n is None:
result = [self.buffer,]
result.append(self.decomp.decompress(self.fp.read(self.length - self.readBytes)))
result.append(self.decomp.decompress("Z"))
result.append(self.decomp.flush())
self.buffer = ""
self.finished = 1
result = "".join(result)
self.returnedBytes += len(result)
return result
else:
while len(self.buffer) < n:
data = self.fp.read(min(n, 1024, self.length - self.readBytes))
self.readBytes += len(data)
if not data:
result = self.buffer + self.decomp.decompress("Z") + self.decomp.flush()
self.finished = 1
self.buffer = ""
self.returnedBytes += len(result)
return result
else:
self.buffer += self.decomp.decompress(data)
result = self.buffer[:n]
self.buffer = self.buffer[n:]
self.returnedBytes += len(result)
return result
def close(self):
self.finished = 1
del self.fp
class ZipFileExt(ZipFile): class ZipFileExt(ZipFile):
def _writecheck(self, zinfo): def _writecheck(self, zinfo):
@@ -148,7 +226,7 @@ class ZipFileExt(ZipFile):
cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION, cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
zlib.DEFLATED, -15) zlib.DEFLATED, -15)
else: else:
cmpr = None cmpr = None
while 1: while 1:
buf = fp.read(1024 * 8) buf = fp.read(1024 * 8)
@@ -169,15 +247,13 @@ class ZipFileExt(ZipFile):
else: else:
zinfo.compress_size = file_size zinfo.compress_size = file_size
# unfortunately pylzma.compressobj is not implemented yet
elif zinfo.compress_type == ZIP_7ZIP: elif zinfo.compress_type == ZIP_7ZIP:
cmp_fp = pylzma.compressfile(fp, eos=1) # unfortunately pylzma.compressobj is not implemented yet.
compressed = '' # So in order to calculate the CRC, we are going to read
while True: # all the file at once until it is implemented.
tmp = cmp_fp.read(1024 * 8) buf = fp.read()
if not tmp: CRC = binascii.crc32(buf, CRC)
break compressed = pylzma.compress(buf, eos=1)
compressed += tmp
self.fp.write(compressed) self.fp.write(compressed)
zinfo.compress_size = len(compressed) zinfo.compress_size = len(compressed)