Skip to content

Commit 49e53c6

Browse files
committed
Small bug fix and fixed 7zip error
1 parent d380e55 commit 49e53c6

File tree

1 file changed

+58
-13
lines changed

1 file changed

+58
-13
lines changed

pyarchivefile.py

Lines changed: 58 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7516,15 +7516,54 @@ def AppendFilesWithContentFromRarFile(infile, fp, extradata=[], jsondata={}, com
75167516
pass
75177517
return fp
75187518

7519+
if(not py7zr_support):
7520+
def sevenzip_readall(infile, **kwargs):
7521+
return False
7522+
else:
7523+
class _MemoryIO(py7zr.Py7zIO):
7524+
"""In-memory file object used by py7zr's factory API."""
7525+
def __init__(self):
7526+
self._buf = bytearray()
7527+
def write(self, data):
7528+
# py7zr will call this repeatedly with chunks
7529+
self._buf.extend(data)
7530+
def read(self, size=None):
7531+
if size is None:
7532+
return bytes(self._buf)
7533+
return bytes(self._buf[:size])
7534+
def seek(self, offset, whence=0):
7535+
# we don't really need seeking for your use case
7536+
return 0
7537+
def flush(self):
7538+
pass
7539+
def size(self):
7540+
return len(self._buf)
7541+
class _MemoryFactory(py7zr.WriterFactory):
7542+
"""Factory that creates _MemoryIO objects and keeps them by filename."""
7543+
def __init__(self):
7544+
self.files = {}
7545+
def create(self, filename: str) -> py7zr.Py7zIO:
7546+
io_obj = _MemoryIO()
7547+
self.files[filename] = io_obj
7548+
return io_obj
7549+
def sevenzip_readall(infile, **kwargs):
7550+
"""
7551+
Replacement for SevenZipFile.readall() using the new py7zr API.
7552+
7553+
Returns: dict[filename -> _MemoryIO]
7554+
"""
7555+
factory = _MemoryFactory()
7556+
with py7zr.SevenZipFile(infile, mode="r", **kwargs) as archive:
7557+
archive.extractall(factory=factory)
7558+
return factory.files
7559+
75197560
if(not py7zr_support):
75207561
def AppendFilesWithContentFromSevenZipFileToList(infile, extradata=[], jsondata={}, contentasfile=False, compression="auto", compresswholefile=True, compressionlevel=None, compressionuselist=compressionlistalt, checksumtype=["md5", "md5", "md5"], formatspecs=__file_format_dict__, saltkey=None, verbose=False):
75217562
return False
75227563
def AppendFilesWithContentFromSevenZipFile(infile, fp, extradata=[], jsondata={}, compression="auto", compresswholefile=True, compressionlevel=None, compressionuselist=compressionlistalt, checksumtype=["md5", "md5", "md5", "md5", "md5"], formatspecs=__file_format_dict__, saltkey=None, verbose=False):
75237564
return False
75247565
else:
7525-
def AppendFilesWithContentFromSevenZipFile(infile, extradata=[], jsondata={}, contentasfile=False, compression="auto", compresswholefile=True, compressionlevel=None, compressionuselist=compressionlistalt, checksumtype=["md5", "md5", "md5"], formatspecs=__file_format_dict__, saltkey=None, verbose=False):
7526-
if(not hasattr(fp, "write")):
7527-
return False
7566+
def AppendFilesWithContentFromSevenZipFileToList(infile, extradata=[], jsondata={}, contentasfile=False, compression="auto", compresswholefile=True, compressionlevel=None, compressionuselist=compressionlistalt, checksumtype=["md5", "md5", "md5"], formatspecs=__file_format_dict__, saltkey=None, verbose=False):
75287567
formver = formatspecs['format_ver']
75297568
fileheaderver = str(int(formver.replace(".", "")))
75307569
curinode = 0
@@ -7536,7 +7575,10 @@ def AppendFilesWithContentFromSevenZipFile(infile, extradata=[], jsondata={}, co
75367575
if(not os.path.exists(infile) or not os.path.isfile(infile)):
75377576
return False
75387577
szpfp = py7zr.SevenZipFile(infile, mode="r")
7539-
file_content = szpfp.readall()
7578+
try:
7579+
file_content = szpfp.readall()
7580+
except AttributeError:
7581+
file_content = sevenzip_readall(infile)
75407582
#sztest = szpfp.testzip()
75417583
sztestalt = szpfp.test()
75427584
if(sztestalt):
@@ -7559,14 +7601,8 @@ def AppendFilesWithContentFromSevenZipFile(infile, extradata=[], jsondata={}, co
75597601
fcsize = format(int(0), 'x').lower()
75607602
flinkcount = 0
75617603
fblksize = 0
7562-
if(hasattr(fstatinfo, "st_blksize")):
7563-
fblksize = format(int(fstatinfo.st_blksize), 'x').lower()
75647604
fblocks = 0
7565-
if(hasattr(fstatinfo, "st_blocks")):
7566-
fblocks = format(int(fstatinfo.st_blocks), 'x').lower()
75677605
fflags = 0
7568-
if(hasattr(fstatinfo, "st_flags")):
7569-
fflags = format(int(fstatinfo.st_flags), 'x').lower()
75707606
ftype = 0
75717607
if(member.is_directory):
75727608
ftype = 5
@@ -7633,7 +7669,10 @@ def AppendFilesWithContentFromSevenZipFile(infile, extradata=[], jsondata={}, co
76337669
typechecktest = CheckCompressionType(fcontents, filestart=0, closefp=False)
76347670
fcontents.seek(0, 0)
76357671
fcencoding = GetFileEncoding(fcontents, 0, False)[0]
7636-
file_content[member.filename].close()
7672+
try:
7673+
file_content[member.filename].close()
7674+
except AttributeError:
7675+
pass
76377676
if(typechecktest is False and not compresswholefile):
76387677
fcontents.seek(0, 2)
76397678
ucfsize = fcontents.tell()
@@ -11908,7 +11947,10 @@ def SevenZipFileListFiles(infile, verbose=False, returnfp=False):
1190811947
lcfi = 0
1190911948
returnval = {}
1191011949
szpfp = py7zr.SevenZipFile(infile, mode="r")
11911-
file_content = szpfp.readall()
11950+
try:
11951+
file_content = szpfp.readall()
11952+
except AttributeError:
11953+
file_content = sevenzip_readall(infile)
1191211954
#sztest = szpfp.testzip()
1191311955
sztestalt = szpfp.test()
1191411956
if(sztestalt):
@@ -11952,7 +11994,10 @@ def SevenZipFileListFiles(infile, verbose=False, returnfp=False):
1195211994
printfname = member.filename
1195311995
if(ftype == 0):
1195411996
fsize = len(file_content[member.filename].read())
11955-
file_content[member.filename].close()
11997+
try:
11998+
file_content[member.filename].close()
11999+
except AttributeError:
12000+
pass
1195612001
try:
1195712002
fuid = int(os.getuid())
1195812003
except (KeyError, AttributeError):

0 commit comments

Comments
 (0)