* crc problemi icin pylzma.compressobj implement edilene kadar dosya bir kerede okunsun
* archive zipfileext kullansin, default 7ZIP olsun
This commit is contained in:
+4
-4
@@ -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
@@ -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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user