mirror of
				https://github.com/qgis/QGIS.git
				synced 2025-10-30 00:07:09 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			65 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # -*- coding:utf-8 -*-
 | |
| """
 | |
| /***************************************************************************
 | |
|                             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()
 |