(self)
Read in the table of contents for the ZIP file.
Read in the table of contents for the ZIP file.
Read in the table of contents for the ZIP file .
def _RealGetContents(self):
        """Read in the table of contents for the ZIP file."""
        fp = self.fp
        try:
            endrec = _EndRecData(fp)
        except OSError:
            raise BadZipFile("File is not a zip file")
        if not endrec:
            raise BadZipFile("File is not a zip file")
        if self.debug > 1:
            print(endrec)
        size_cd = endrec[_ECD_SIZE]             # bytes in central directory
        offset_cd = endrec[_ECD_OFFSET]         # offset of central directory
        self._comment = endrec[_ECD_COMMENT]    # archive comment

        # "concat" is zero, unless zip was concatenated to another file
        concat = endrec[_ECD_LOCATION] - size_cd - offset_cd
        if endrec[_ECD_SIGNATURE] == stringEndArchive64:
            # If Zip64 extension structures are present, account for them
            concat -= (sizeEndCentDir64 + sizeEndCentDir64Locator)

        if self.debug > 2:
            inferred = concat + offset_cd
            print("given, inferred, offset", offset_cd, inferred, concat)
        # self.start_dir:  Position of start of central directory
        self.start_dir = offset_cd + concat
        fp.seek(self.start_dir, 0)
        data = fp.read(size_cd)
        fp = io.BytesIO(data)
        total = 0
        while total < size_cd:
            centdir = fp.read(sizeCentralDir)
            if len(centdir) != sizeCentralDir:
                raise BadZipFile("Truncated central directory")
            centdir = struct.unpack(structCentralDir, centdir)
            if centdir[_CD_SIGNATURE] != stringCentralDir:
                raise BadZipFile("Bad magic number for central directory")
            if self.debug > 2:
                print(centdir)
            filename = fp.read(centdir[_CD_FILENAME_LENGTH])
            flags = centdir[5]
            if flags & 0x800:
                # UTF-8 file names extension
                filename = filename.decode('utf-8')
            else:
                # Historical ZIP filename encoding
                filename = filename.decode('cp437')
            # Create ZipInfo instance to store file information
            x = ZipInfo(filename)
            x.extra = fp.read(centdir[_CD_EXTRA_FIELD_LENGTH])
            x.comment = fp.read(centdir[_CD_COMMENT_LENGTH])
            x.header_offset = centdir[_CD_LOCAL_HEADER_OFFSET]
            (x.create_version, x.create_system, x.extract_version, x.reserved,
             x.flag_bits, x.compress_type, t, d,
             x.CRC, x.compress_size, x.file_size) = centdir[1:12]
            if x.extract_version > MAX_EXTRACT_VERSION:
                raise NotImplementedError("zip file version %.1f" %
                                          (x.extract_version / 10))
            x.volume, x.internal_attr, x.external_attr = centdir[15:18]
            # Convert date/time code to (year, month, day, hour, min, sec)
            x._raw_time = t
            x.date_time = ( (d>>9)+1980, (d>>5)&0xF, d&0x1F,
                            t>>11, (t>>5)&0x3F, (t&0x1F) * 2 )

            x._decodeExtra()
            x.header_offset = x.header_offset + concat
            self.filelist.append(x)
            self.NameToInfo[x.filename] = x

            # update total bytes read from central directory
            total = (total + sizeCentralDir + centdir[_CD_FILENAME_LENGTH]
                     + centdir[_CD_EXTRA_FIELD_LENGTH]
                     + centdir[_CD_COMMENT_LENGTH])

            if self.debug > 2:
                print("total", total)
def _RealGetContents ( self ) : fp = self . fp try : endrec = _EndRecData ( fp ) except OSError : raise BadZipFile ( "File is not a zip file" ) if not endrec : raise BadZipFile ( "File is not a zip file" ) if self . debug > 1 : print ( endrec ) size_cd = endrec [ _ECD_SIZE ] # bytes in central directory offset_cd = endrec [ _ECD_OFFSET ] # offset of central directory self . _comment = endrec [ _ECD_COMMENT ] # archive comment # "concat" is zero, unless zip was concatenated to another file concat = endrec [ _ECD_LOCATION ] - size_cd - offset_cd if endrec [ _ECD_SIGNATURE ] == stringEndArchive64 : # If Zip64 extension structures are present, account for them concat -= ( sizeEndCentDir64 + sizeEndCentDir64Locator ) if self . debug > 2 : inferred = concat + offset_cd print ( "given, inferred, offset" , offset_cd , inferred , concat ) # self.start_dir:  Position of start of central directory self . start_dir = offset_cd + concat fp . seek ( self . start_dir , 0 ) data = fp . read ( size_cd ) fp = io . BytesIO ( data ) total = 0 while total < size_cd : centdir = fp . read ( sizeCentralDir ) if len ( centdir ) != sizeCentralDir : raise BadZipFile ( "Truncated central directory" ) centdir = struct . unpack ( structCentralDir , centdir ) if centdir [ _CD_SIGNATURE ] != stringCentralDir : raise BadZipFile ( "Bad magic number for central directory" ) if self . debug > 2 : print ( centdir ) filename = fp . read ( centdir [ _CD_FILENAME_LENGTH ] ) flags = centdir [ 5 ] if flags & 0x800 : # UTF-8 file names extension filename = filename . decode ( 'utf-8' ) else : # Historical ZIP filename encoding filename = filename . decode ( 'cp437' ) # Create ZipInfo instance to store file information x = ZipInfo ( filename ) x . extra = fp . read ( centdir [ _CD_EXTRA_FIELD_LENGTH ] ) x . comment = fp . read ( centdir [ _CD_COMMENT_LENGTH ] ) x . header_offset = centdir [ _CD_LOCAL_HEADER_OFFSET ] ( x . create_version , x . create_system , x . extract_version , x . reserved , x . flag_bits , x . compress_type , t , d , x . CRC , x . compress_size , x . file_size ) = centdir [ 1 : 12 ] if x . extract_version > MAX_EXTRACT_VERSION : raise NotImplementedError ( "zip file version %.1f" % ( x . extract_version / 10 ) ) x . volume , x . internal_attr , x . external_attr = centdir [ 15 : 18 ] # Convert date/time code to (year, month, day, hour, min, sec) x . _raw_time = t x . date_time = ( ( d >> 9 ) + 1980 , ( d >> 5 ) & 0xF , d & 0x1F , t >> 11 , ( t >> 5 ) & 0x3F , ( t & 0x1F ) * 2 ) x . _decodeExtra ( ) x . header_offset = x . header_offset + concat self . filelist . append ( x ) self . NameToInfo [ x . filename ] = x # update total bytes read from central directory total = ( total + sizeCentralDir + centdir [ _CD_FILENAME_LENGTH ] + centdir [ _CD_EXTRA_FIELD_LENGTH ] + centdir [ _CD_COMMENT_LENGTH ] ) if self . debug > 2 : print ( "total" , total )