# -*- coding: utf-8 -*- # -------------------------------------------------------------------------------- # Zip Tools # -------------------------------------------------------------------------------- from builtins import object import sys PY3 = False VFS = True if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int; VFS = False import zipfile from platformcode import config, logger from core import filetools class ziptools(object): def extract(self, file, dir, folder_to_extract="", overwrite_question=False, backup=False): logger.info("file=%s" % file) logger.info("dir=%s" % dir) if not dir.endswith(':') and not filetools.exists(dir): filetools.mkdir(dir) zf = zipfile.ZipFile(file) if not folder_to_extract: self._createstructure(file, dir) num_files = len(zf.namelist()) for nameo in zf.namelist(): name = nameo.replace(':', '_').replace('<', '_').replace('>', '_').replace('|', '_').replace('"', '_').replace('?', '_').replace('*', '_') logger.info("name=%s" % nameo) if not name.endswith('/'): logger.info("no es un directorio") try: (path, filename) = filetools.split(filetools.join(dir, name)) logger.info("path=%s" % path) logger.info("name=%s" % name) if folder_to_extract: if path != filetools.join(dir, folder_to_extract): break else: filetools.mkdir(path) except: pass if folder_to_extract: outfilename = filetools.join(dir, filename) else: outfilename = filetools.join(dir, name) logger.info("outfilename=%s" % outfilename) try: if filetools.exists(outfilename) and overwrite_question: from platformcode import platformtools dyesno = platformtools.dialog_yesno("El archivo ya existe", "El archivo %s a descomprimir ya existe" \ ", ¿desea sobrescribirlo?" \ % filetools.basename(outfilename)) if not dyesno: break if backup: import time hora_folder = "Copia seguridad [%s]" % time.strftime("%d-%m_%H-%M", time.localtime()) backup = filetools.join(config.get_data_path(), 'backups', hora_folder, folder_to_extract) if not filetools.exists(backup): filetools.mkdir(backup) filetools.copy(outfilename, filetools.join(backup, filetools.basename(outfilename))) if not filetools.write(outfilename, zf.read(nameo), silent=True, vfs=VFS): #TRUNCA en FINAL en Kodi 19 con VFS logger.error("Error en fichero " + nameo) except: import traceback logger.error(traceback.format_exc()) logger.error("Error en fichero " + nameo) try: zf.close() except: logger.info("Error cerrando .zip " + file) def _createstructure(self, file, dir): self._makedirs(self._listdirs(file), dir) def create_necessary_paths(filename): try: (path, name) = filetools.split(filename) filetools.mkdir(path) except: pass def _makedirs(self, directories, basedir): for dir in directories: curdir = filetools.join(basedir, dir) if not filetools.exists(curdir): filetools.mkdir(curdir) def _listdirs(self, file): zf = zipfile.ZipFile(file) dirs = [] for name in zf.namelist(): if name.endswith('/'): dirs.append(name) dirs.sort() return dirs def zip(self, dir, file): import os zf = zipfile.ZipFile(file, "w", zipfile.ZIP_DEFLATED) abs_src = os.path.abspath(dir) for dirname, subdirs, files in os.walk(dir): for filename in files: absname = os.path.abspath(os.path.join(dirname, filename)) arcname = absname[len(abs_src) + 1:] zf.write(absname, arcname) zf.close()