148 lines
4.4 KiB
PHP
Raw Permalink Normal View History

2024-08-31 01:03:37 +08:00
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
// ZipArchive 解压缩
class kodZipArchive{
static $listCache = array();
static function support($type=''){
$result = false;
if($type == 'extract' && defined("ZIP_ARCHIVE_LOCAL")){// 只允许创建压缩文件用系统调用
$result = true;
}
if(!class_exists('ZipArchive')){
$result = false;
}
// else { $result = true; }
return $result;
}
static function listContent($file){
$file_hash = hash_path($file);
if(isset(self::$listCache[$file_hash])){
return self::$listCache[$file_hash];
}
$zip = new ZipArchive();
$zip->open($file);
$count = $zip->numFiles;
for ($i = 0; $i < $count; $i++) {
$entry = $zip->statIndex($i);
$filename = str_replace('\\', '/', $entry['name']);
$result[] = array(
'filename' => $entry['name'],
'stored_filename' => $entry['name'],
'size' => $entry['size'],
'compressed_size' => $entry['comp_size'],
'mtime' => $entry['mtime'],
'index' => $i,
'folder' => (substr($entry['name'], -1, 1) == '/'),
'crc' => $entry['crc']
);
}
self::$listCache[$file_hash] = $result;
return $result;
}
/**
* [extract description]
* @param [type] $file [archive file]
* @param [type] $dest [extract to folder]
* @param string $part [archive file content]
* @return [type] [array]
*/
static function extract($file,$dest,$partName=false) {
$dest_before = $dest;
$dest = TEMP_FILES.md5(rand_string(40).time()).'/';
mk_dir($dest);
$zip = new ZipArchive();
if(!$zip->open($file)){
return array('code'=>false,'data'=>'Can not open zip file!');
}
if($partName === false){
$result = $zip->extractTo($dest);
}else{
if(!is_array($partName)){
$partName = array($partName);
}
$matchFiles = $partName;
//解压文件夹
if(substr($partName[0], -1, 1) == '/'){
$matchFiles = array();
$list = self::listContent($file);
foreach ($list as $item) {
if ( strpos($item['filename'],$partName[0]) === 0 ) {
$matchFiles[] = $item['filename'];
}
}
}
$result = $zip->extractTo($dest,$matchFiles);
}
$zip->close();
//子目录解压移除多余层级目录
if( is_array($partName) ){//
$thePath = trim(str_replace("\\",'/',$partName[0]),'/');
$pathGroup = explode('/',$thePath);
//一级目录解压不用移动
if(count($pathGroup) > 1){
move_path($dest.$partName[0],$dest.get_path_this($thePath));
del_dir($dest.$pathGroup[0]);
}else{
$dest_before = get_path_father($dest_before);
}
}
//扩展名处理;文件名重命名处理
$arr = dir_list($dest);
foreach($arr as $f){
$itemPath = str_replace(array($dest,"\\"),array('','/'),$f);
$itemPath = unzip_pre_name($itemPath);
$from = $dest.get_path_father($itemPath).get_path_this($f);
if(strstr($itemPath,'/') == false){
$from = $dest.get_path_this($f);
}
if($dest.$itemPath != $from){
@rename($from,$dest.$itemPath);
}
}
$res = move_path($dest,$dest_before);
if(file_exists($dest)){move_path($dest,$dest_before);} // 有出错的情况时再来一次;文件锁定的情况
del_dir(rtrim($dest,'/'));
return array('code'=>$result,'data'=>$result);
}
/**
* [create description]
* @param [type] $file [creat file to]
* @param [type] $files [array from]
* @return [type] [description]
*/
static function create($file,$files) {
$zip = new ZipArchive();
if(!$zip->open($file, ZipArchive::CREATE)){
return false;//Can not open(create) zip file!'
}
foreach ($files as $key =>$val) {
$val = str_replace(array('//','\\'),'/',$val);
$removePathPre = Kodio::clear(get_path_father($val));
$list = array($val);
if(is_dir($val)){
$list = dir_list($val);
$list[] = $val;
}
foreach ($list as $item) {
$addName = zip_pre_name(str_replace($removePathPre,'',$item));
if(is_dir($item)){
$result = $zip->addEmptyDir($addName);
}else{
$result = $zip->addFile($item,$addName);
}
}
}
$zip->close();
return $result;
}
}