php压缩文件夹最新版


Posted in PHP onJuly 18, 2018

本文实例为大家分享了php压缩文件夹的具体代码,供大家参考,具体内容如下

优点:

1. 支持压缩中文文件名
2. 支持子目录递归压缩
3. 同zip文件,重复压缩会合并新增文件,覆盖原来zip中的交集部分,不删除目录下消失的文件,只增不减(自己创建一个目录,生成只有A和B文件的test.zip,然后增加C文件在目录,再压缩成同名test.zip,那么zip里面会有ABC三个文件;如果目录删除其他文件,仅保留A文件,生成test.zip不会有改变,里面还是有ABC)

缺点:

1. 单个文件不能压缩 (todo)
2. 文件夹下,不能仅挑选数个文件进行压缩(todo)

/**
 * 总接口
 * @param $dir_path 需要压缩的目录地址(绝对路径)
 * @param $zipName 需要生成的zip文件名(绝对路径)
 */
function zip($dir_path,$zipName){
  $relationArr = [$dir_path=>[
    'originName'=>$dir_path,
    'is_dir' => true,
    'children'=>[]
  ]];
  modifiyFileName($dir_path,$relationArr[$dir_path]['children']);
  $zip = new ZipArchive();
  $zip->open($zipName,ZipArchive::CREATE);
  zipDir(array_keys($relationArr)[0],'',$zip,array_values($relationArr)[0]['children']);
  $zip->close();
  restoreFileName(array_keys($relationArr)[0],array_values($relationArr)[0]['children']);
}

/**
 * 递归添加文件进入zip
 * @param $real_path 在需要压缩的本地的目录
 * @param $zip_path zip里面的相对目录
 * @param $zip ZipArchive对象
 * @param $relationArr 目录的命名关系
 */
function zipDir($real_path,$zip_path,&$zip,$relationArr){
  $sub_zip_path = empty($zip_path)?'':$zip_path.'\\';
  if (is_dir($real_path)){
    foreach($relationArr as $k=>$v){
      if($v['is_dir']){ //是文件夹
        $zip->addEmptyDir($sub_zip_path.$v['originName']);
        zipDir($real_path.'\\'.$k,$sub_zip_path.$v['originName'],$zip,$v['children']);
      }else{ //不是文件夹
        $zip->addFile($real_path.'\\'.$k,$sub_zip_path.$k);
        $zip->deleteName($sub_zip_path.$v['originName']);
        $zip->renameName($sub_zip_path.$k,$sub_zip_path.$v['originName']);
      }
    }
  }
}

/**
 * 递归将目录的文件名更改为随机不重复编号,然后保存原名和编号关系
 * @param $path 本地目录地址
 * @param $relationArr 关系数组
 * @return bool
 */
function modifiyFileName($path,&$relationArr){
  if(!is_dir($path) || !is_array($relationArr)){
    return false;
  }
  if($dh = opendir($path)){
    $count = 0;
    while (($file = readdir($dh)) !== false){
      if(in_array($file,['.','..',null])) continue; //无效文件,重来
      if(is_dir($path.'\\'.$file)){
        $newName = md5(rand(0,99999).rand(0,99999).rand(0,99999).microtime().'dir'.$count);
        $relationArr[$newName] = [
          'originName' => iconv('GBK','UTF-8',$file),
          'is_dir' => true,
          'children' => []
        ];
        rename($path.'\\'.$file, $path.'\\'.$newName);
        modifiyFileName($path.'\\'.$newName,$relationArr[$newName]['children']);
        $count++;
      }
      else{
        $extension = strchr($file,'.');
        $newName = md5(rand(0,99999).rand(0,99999).rand(0,99999).microtime().'file'.$count);
        $relationArr[$newName.$extension] = [
          'originName' => iconv('GBK','UTF-8',$file),
          'is_dir' => false,
          'children' => []
        ];
        rename($path.'\\'.$file, $path.'\\'.$newName.$extension);
        $count++;
      }
    }
  }
}

/**
 * 根据关系数组,将本地目录的文件名称还原成原文件名
 * @param $path 本地目录地址
 * @param $relationArr 关系数组
 */
function restoreFileName($path,$relationArr){
  foreach($relationArr as $k=>$v){
    if(!empty($v['children'])){
      restoreFileName($path.'\\'.$k,$v['children']);
      rename($path.'\\'.$k,iconv('UTF-8','GBK',$path.'\\'.$v['originName']));
    }else{
      rename($path.'\\'.$k,iconv('UTF-8','GBK',$path.'\\'.$v['originName']));
    }
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
simplehtmldom Doc api帮助文档
Mar 26 PHP
解析php dirname()与__FILE__常量的应用
Jun 24 PHP
百度工程师讲PHP函数的实现原理及性能分析(三)
May 13 PHP
php强制用户转向www域名的方法
Jun 19 PHP
PHP 二维数组和三维数组的过滤
Mar 16 PHP
对比PHP对MySQL的缓冲查询和无缓冲查询
Jul 01 PHP
ThinkPHP打水印及设置水印位置的方法
Oct 14 PHP
PHP实现原生态图片上传封装类方法
Nov 08 PHP
PHP未登录自动跳转到登录页面
Dec 21 PHP
Laravel框架自定义公共函数的引入操作示例
Apr 16 PHP
yii2的restful api路由实例详解
May 14 PHP
PHP 观察者模式深入理解与应用分析
Sep 25 PHP
PHP自定义递归函数实现数组转JSON功能【支持GBK编码】
Jul 17 #PHP
PHP7新特性之抽象语法树(AST)带来的变化详解
Jul 17 #PHP
阿里云的WindowsServer2016上部署php+apache
Jul 17 #PHP
tp5实现微信小程序多图片上传到服务器功能
Jul 16 #PHP
PHP 爬取网页的主要方法
Jul 13 #PHP
php实现微信发红包功能
Jul 13 #PHP
Yii2框架redis基本应用示例
Jul 13 #PHP
You might like
Apache, PHP在Windows 9x/NT下的安装与配置 (一)
2006/10/09 PHP
php实现可以设置中奖概率的抽奖程序代码分享
2014/01/19 PHP
PHP计算加权平均数的方法
2015/07/16 PHP
浅谈PHP中静态方法和非静态方法的相互调用
2016/10/04 PHP
smarty模板数学运算示例
2016/12/11 PHP
Laravel5.5新特性之友好报错以及展示详解
2017/08/13 PHP
PHP中创建和编辑Excel表格的方法
2018/09/13 PHP
js对字符串进行编码的方法总结(推荐)
2016/11/10 Javascript
Vue学习笔记之表单输入控件绑定
2017/09/05 Javascript
JS求Number类型数组中最大元素方法
2018/04/08 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
vue interceptor 使用教程实例详解
2018/09/13 Javascript
新手简单了解vue
2019/05/29 Javascript
详解ng-alain动态表单SF表单项设置必填和正则校验
2019/06/11 Javascript
Vue使用screenfull实现全屏效果
2020/09/17 Javascript
python函数缺省值与引用学习笔记分享
2013/02/10 Python
进一步了解Python中的XML 工具
2015/04/13 Python
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
python实现简单爬虫功能的示例
2016/10/24 Python
AI人工智能 Python实现人机对话
2017/11/13 Python
python opencv检测目标颜色的实例讲解
2018/04/02 Python
对Python3.6 IDLE常用快捷键介绍
2018/07/16 Python
Python常见内置高效率函数用法示例
2018/07/31 Python
django框架CSRF防护原理与用法分析
2019/07/22 Python
python标准库os库的函数介绍
2020/02/12 Python
Selenium python时间控件输入问题解决方案
2020/07/22 Python
英国领先的亚洲旅游专家:Wendy Wu Tours
2018/01/21 全球购物
英国手机零售商:Metrofone
2019/03/18 全球购物
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
ECCO俄罗斯官网:北欧丹麦鞋履及皮具品牌
2020/06/26 全球购物
单位实习证明怎么写
2014/01/17 职场文书
《夸父追日》教学反思
2014/02/26 职场文书
高三家长寄语
2014/04/03 职场文书
Go缓冲channel和非缓冲channel的区别说明
2021/04/25 Golang
Python并发编程实例教程之线程的玩法
2021/06/20 Python
Apache SeaTunnel实现 非CDC数据抽取
2022/05/20 Servers