def _extract_members(self, members, targetpath, pwd): """Extract the RarInfo objects 'members' to a physical file on the path targetpath. """ archive = unrarlib.RAROpenArchiveDataEx(self.filename, mode=constants.RAR_OM_EXTRACT) handle = self._open(archive) password = pwd or self.pwd if password is not None: unrarlib.RARSetPassword(handle, b(password)) try: rarinfo = self._read_header(handle) while rarinfo is not None: if rarinfo.filename in members: self._process_current(handle, constants.RAR_EXTRACT, targetpath) else: self._process_current(handle, constants.RAR_SKIP) rarinfo = self._read_header(handle) except unrarlib.UnrarException: raise BadRarFile("Bad RAR archive data.") finally: self._close(handle)
def _extract_members(self, members, targetpath, pwd): """Extract the RarInfo objects 'members' to a physical file on the path targetpath. """ archive = unrarlib.RAROpenArchiveDataEx(self.filename, mode=constants.RAR_OM_EXTRACT) handle = self._open(archive) password = pwd or self.pwd if password is not None: unrarlib.RARSetPassword(handle, b(password)) try: rarinfo = self._read_header(handle) while rarinfo is not None: if rarinfo.filename in members: self._process_current(handle, constants.RAR_EXTRACT, targetpath) else: self._process_current(handle, constants.RAR_SKIP) rarinfo = self._read_header(handle) except unrarlib.MissingPassword: raise RuntimeError("File is encrypted, password required") except unrarlib.BadPassword: raise RuntimeError("Bad password for File") except unrarlib.BadDataError: raise RuntimeError("File CRC Error") except unrarlib.UnrarException as e: raise BadRarFile("Bad RAR archive data: %s" % str(e)) finally: self._close(handle)
def open(self, member, pwd=None): """Return file-like object for 'member'. 'member' may be a filename or a RarInfo object. """ if isinstance(member, RarInfo): member = member.filename archive = unrarlib.RAROpenArchiveDataEx(self.filename, mode=constants.RAR_OM_EXTRACT) handle = self._open(archive) password = pwd or self.pwd if password is not None: unrarlib.RARSetPassword(handle, b(password)) # based on BrutuZ (https://github.com/matiasb/python-unrar/pull/4) # and Cubixmeister work data = _ReadIntoMemory() c_callback = unrarlib.UNRARCALLBACK(data._callback) unrarlib.RARSetCallback(handle, c_callback, 0) try: rarinfo = self._read_header(handle) while rarinfo is not None: if rarinfo.filename == member: self._process_current(handle, constants.RAR_TEST) break else: self._process_current(handle, constants.RAR_SKIP) rarinfo = self._read_header(handle) if rarinfo is None: data = None except unrarlib.MissingPassword: raise RuntimeError("File is encrypted, password required") except unrarlib.BadPassword: raise RuntimeError("Bad password for File") except unrarlib.BadDataError: if password is not None: raise RuntimeError("File CRC error or incorrect password") else: raise RuntimeError("File CRC error") except unrarlib.UnrarException as e: raise BadRarFile("Bad RAR archive data: %s" % str(e)) finally: self._close(handle) if data is None: raise KeyError('There is no item named %r in the archive' % member) # return file-like object return data.get_bytes()
def __init__(self, filename, mode='r', pwd=None): """Load RAR archive file with mode read only "r".""" self.filename = filename mode = constants.RAR_OM_LIST_INCSPLIT archive = unrarlib.RAROpenArchiveDataEx(filename, mode=mode) handle = self._open(archive) # assert(archive.OpenResult == constants.SUCCESS) self.pwd = pwd if self.pwd is not None: unrarlib.RARSetPassword(handle, b(self.pwd)) self.filelist = [] self.NameToInfo = {} if archive.CmtState == constants.RAR_COMMENTS_SUCCESS: self.comment = archive.CmtBuf.value else: self.comment = None self._load_metadata(handle) self._close(handle)
def testrar(self): """Read all the files and check the CRC.""" error = None rarinfo = None archive = unrarlib.RAROpenArchiveDataEx(self.filename, mode=constants.RAR_OM_EXTRACT) handle = self._open(archive) if self.pwd: unrarlib.RARSetPassword(handle, b(self.pwd)) try: rarinfo = self._read_header(handle) while rarinfo is not None: self._process_current(handle, constants.RAR_TEST) rarinfo = self._read_header(handle) except unrarlib.UnrarException: error = rarinfo.filename if rarinfo else self.filename finally: self._close(handle) return error