解压19K压缩包失败,怎么解决,是因为内存不够,测试3.3k是能解压成功的
解压代码用的是移远的示例,压缩包是.tar.gz格式
import uzlib as zlib
import ql_fs
# unzip_Chic
import log
log.basicConfig(level=log.INFO)
unzip_Chic_log = log.getLogger(“unzip_Chic”)
class FileDecode(object):
def \__init_\_(self, zip_file, parent_dir="/usr/"):
self.fp = open(zip_file, "rb")
self.fileData = None
self.parent_dir = parent_dir
def unzip(self):
"""缓存到内存中"""
self.fp.seek(10)
data = self.fp.read()
self.fileData = zlib.decompress(data, -15)
@classmethod
def \_ascii_trip(cls, data):
return data.decode('ascii').rstrip('\\0')
@classmethod
def file_size(cls, data):
"""获取真实size数据"""
size = cls.\_ascii_trip(data)
if not len(size):
return 0
return int(size, 8)
@classmethod
def get_file_name(cls, file_name):
"""获取文件名称"""
return cls.\_ascii_trip(file_name)
def unpack(self):
"""解压文件"""
idx = 0
count = len(self.fileData)
folder_list = set()
unzip_Chic_log.info("total_size:" + str(count))
while idx < count:
size = self.file_size(self.fileData\[idx + 124:idx + 135\])
file_name = self.get_file_name(self.fileData\[idx:idx + 100\])
full_file_name = self.parent_dir + file_name
if not size:
if len(full_file_name):
"""文件夹"""
ql_fs.mkdirs(full_file_name)
if full_file_name not in folder_list and full_file_name != self.parent_dir:
folder_list.add(full_file_name)
unzip_Chic_log.info("Folder {} CREATED".format(full_file_name))
else:
return
else:
begin = idx + 512
end = idx + 512 + size
write_data = self.fileData\[begin:end\]
update_file = open(full_file_name, "wb+")
update_file.write(write_data)
update_file.close()
unzip_Chic_log.info("FILE {} WRITE BYTE BEGIN {} END {}".format(full_file_name, begin, end))
""" 由于打包过程中会对文件长度不为512整数倍时,会对文件尾部补\\x00操作,故在此将文件尾部填充长度添加到文件长度中, """
if (size & 0x1ff) != 0:
size += 512 - (size & 0x1ff)
idx += 512 + size
unzip_Chic_log.info("UNPACK SUCCESS")
def unzipstart(appname):
fd = FileDecode("usr/.updater/usr/%s" % appname)
fd.unzip()
fd.unpack()
\# try:
\# uos.remove("usr/.updater/usr/%s" % appname)
\# except:
\# pass