mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-22 00:06:12 -05:00
64 lines
2.4 KiB
Python
64 lines
2.4 KiB
Python
"""
|
|
/***************************************************************************
|
|
Plugin Installer module
|
|
unzip function
|
|
-------------------
|
|
Date : May 2013
|
|
Copyright : (C) 2013 by Borys Jurgiel
|
|
Email : info at borysjurgiel dot pl
|
|
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
***************************************************************************/
|
|
"""
|
|
|
|
import zipfile
|
|
import os
|
|
|
|
|
|
def unzip(file, targetDir, password=None):
|
|
"""Creates directory structure and extracts the zip contents to it.
|
|
file (file object) - the zip file to extract
|
|
targetDir (str) - target location
|
|
password (str; optional) - password to decrypt the zip file (if encrypted)
|
|
"""
|
|
|
|
# convert password to bytes
|
|
if isinstance(password, str):
|
|
password = bytes(password, "utf8")
|
|
|
|
# create destination directory if doesn't exist
|
|
if not targetDir.endswith(":") and not os.path.exists(targetDir):
|
|
os.makedirs(targetDir)
|
|
|
|
zf = zipfile.ZipFile(file)
|
|
for name in zf.namelist():
|
|
# Skip directories - they will be created when necessary by os.makedirs
|
|
if name.endswith("/"):
|
|
continue
|
|
|
|
# Read the source file before creating any output,
|
|
# so no directories are created if user doesn't know the password
|
|
memberContent = zf.read(name, password)
|
|
|
|
# create directory if doesn't exist
|
|
localDir = os.path.split(name)[0]
|
|
fullDir = os.path.normpath(os.path.join(targetDir, localDir))
|
|
if not os.path.exists(fullDir):
|
|
os.makedirs(fullDir)
|
|
# extract file
|
|
fullPath = os.path.normpath(os.path.join(targetDir, name))
|
|
outfile = open(fullPath, "wb")
|
|
outfile.write(memberContent)
|
|
outfile.flush()
|
|
outfile.close()
|
|
|
|
zf.close()
|