def _EndRecData(fpin):
fpin.seek(0, 2)
filesize = fpin.tell()
try:
fpin.seek(-sizeEndCentDir, 2)
except OSError:
return None
data = fpin.read()
if (len(data) == sizeEndCentDir and
data[0:4] == stringEndArchive and
data[-2:] == b"\000\000"):
endrec = struct.unpack(structEndArchive, data)
endrec=list(endrec)
endrec.append(b"")
endrec.append(filesize - sizeEndCentDir)
return _EndRecData64(fpin, -sizeEndCentDir, endrec)
maxCommentStart = max(filesize - (1 << 16) - sizeEndCentDir, 0)
fpin.seek(maxCommentStart, 0)
data = fpin.read()
start = data.rfind(stringEndArchive)
if start >= 0:
recData = data[start:start+sizeEndCentDir]
if len(recData) != sizeEndCentDir:
return None
endrec = list(struct.unpack(structEndArchive, recData))
commentSize = endrec[_ECD_COMMENT_SIZE]
comment = data[start+sizeEndCentDir:start+sizeEndCentDir+commentSize]
endrec.append(comment)
endrec.append(maxCommentStart + start)
return _EndRecData64(fpin, maxCommentStart + start - filesize,
endrec)
return None
此函数返回文件的中央目录结束记录值或返回none。
已知的是end of central directory record值存储在zip的“End of central dir”结构(这个结构是个列表)中的第九项,相对启动磁盘编号的中央目录启动偏移量保存在列表的第十项。最终的值由方法_EndRecData64对Zip64 end of central directory record进行读取并返回中央目录结束值。
_EndRecData64在此不进行具体阐述,有兴趣的同学可以阅读zipfile.py中的def _EndRecData64(fpin, offset, endrec)及zip官方文档中的Zip64 end of central directory record进行学习。