Skip to content

Commit 0856593

Browse files
committed
Small bug fix and fixed 7zip error
1 parent a4bf9a8 commit 0856593

1 file changed

Lines changed: 58 additions & 13 deletions

File tree

pycatfile.py

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

7525+
if(not py7zr_support):
7526+
def sevenzip_readall(infile, **kwargs):
7527+
return False
7528+
else:
7529+
class _MemoryIO(py7zr.Py7zIO):
7530+
"""In-memory file object used by py7zr's factory API."""
7531+
def __init__(self):
7532+
self._buf = bytearray()
7533+
def write(self, data):
7534+
# py7zr will call this repeatedly with chunks
7535+
self._buf.extend(data)
7536+
def read(self, size=None):
7537+
if size is None:
7538+
return bytes(self._buf)
7539+
return bytes(self._buf[:size])
7540+
def seek(self, offset, whence=0):
7541+
# we don't really need seeking for your use case
7542+
return 0
7543+
def flush(self):
7544+
pass
7545+
def size(self):
7546+
return len(self._buf)
7547+
class _MemoryFactory(py7zr.WriterFactory):
7548+
"""Factory that creates _MemoryIO objects and keeps them by filename."""
7549+
def __init__(self):
7550+
self.files = {}
7551+
def create(self, filename: str) -> py7zr.Py7zIO:
7552+
io_obj = _MemoryIO()
7553+
self.files[filename] = io_obj
7554+
return io_obj
7555+
def sevenzip_readall(infile, **kwargs):
7556+
"""
7557+
Replacement for SevenZipFile.readall() using the new py7zr API.
7558+
7559+
Returns: dict[filename -> _MemoryIO]
7560+
"""
7561+
factory = _MemoryFactory()
7562+
with py7zr.SevenZipFile(infile, mode="r", **kwargs) as archive:
7563+
archive.extractall(factory=factory)
7564+
return factory.files
7565+
75257566
if(not py7zr_support):
75267567
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):
75277568
return False
75287569
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):
75297570
return False
75307571
else:
7531-
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):
7532-
if(not hasattr(fp, "write")):
7533-
return False
7572+
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):
75347573
formver = formatspecs['format_ver']
75357574
fileheaderver = str(int(formver.replace(".", "")))
75367575
curinode = 0
@@ -7542,7 +7581,10 @@ def AppendFilesWithContentFromSevenZipFile(infile, extradata=[], jsondata={}, co
75427581
if(not os.path.exists(infile) or not os.path.isfile(infile)):
75437582
return False
75447583
szpfp = py7zr.SevenZipFile(infile, mode="r")
7545-
file_content = szpfp.readall()
7584+
try:
7585+
file_content = szpfp.readall()
7586+
except AttributeError:
7587+
file_content = sevenzip_readall(infile)
75467588
#sztest = szpfp.testzip()
75477589
sztestalt = szpfp.test()
75487590
if(sztestalt):
@@ -7565,14 +7607,8 @@ def AppendFilesWithContentFromSevenZipFile(infile, extradata=[], jsondata={}, co
75657607
fcsize = format(int(0), 'x').lower()
75667608
flinkcount = 0
75677609
fblksize = 0
7568-
if(hasattr(fstatinfo, "st_blksize")):
7569-
fblksize = format(int(fstatinfo.st_blksize), 'x').lower()
75707610
fblocks = 0
7571-
if(hasattr(fstatinfo, "st_blocks")):
7572-
fblocks = format(int(fstatinfo.st_blocks), 'x').lower()
75737611
fflags = 0
7574-
if(hasattr(fstatinfo, "st_flags")):
7575-
fflags = format(int(fstatinfo.st_flags), 'x').lower()
75767612
ftype = 0
75777613
if(member.is_directory):
75787614
ftype = 5
@@ -7639,7 +7675,10 @@ def AppendFilesWithContentFromSevenZipFile(infile, extradata=[], jsondata={}, co
76397675
typechecktest = CheckCompressionType(fcontents, filestart=0, closefp=False)
76407676
fcontents.seek(0, 0)
76417677
fcencoding = GetFileEncoding(fcontents, 0, False)[0]
7642-
file_content[member.filename].close()
7678+
try:
7679+
file_content[member.filename].close()
7680+
except AttributeError:
7681+
pass
76437682
if(typechecktest is False and not compresswholefile):
76447683
fcontents.seek(0, 2)
76457684
ucfsize = fcontents.tell()
@@ -11914,7 +11953,10 @@ def SevenZipFileListFiles(infile, verbose=False, returnfp=False):
1191411953
lcfi = 0
1191511954
returnval = {}
1191611955
szpfp = py7zr.SevenZipFile(infile, mode="r")
11917-
file_content = szpfp.readall()
11956+
try:
11957+
file_content = szpfp.readall()
11958+
except AttributeError:
11959+
file_content = sevenzip_readall(infile)
1191811960
#sztest = szpfp.testzip()
1191911961
sztestalt = szpfp.test()
1192011962
if(sztestalt):
@@ -11958,7 +12000,10 @@ def SevenZipFileListFiles(infile, verbose=False, returnfp=False):
1195812000
printfname = member.filename
1195912001
if(ftype == 0):
1196012002
fsize = len(file_content[member.filename].read())
11961-
file_content[member.filename].close()
12003+
try:
12004+
file_content[member.filename].close()
12005+
except AttributeError:
12006+
pass
1196212007
try:
1196312008
fuid = int(os.getuid())
1196412009
except (KeyError, AttributeError):

0 commit comments

Comments
 (0)