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 相关文章推荐
建立动态的WML站点(三)
Oct 09 PHP
php设计模式 Chain Of Responsibility (职责链模式)
Jun 26 PHP
用穿越火线快速入门php面向对象
Feb 22 PHP
php中将html中的br换行符转换为文本输入中的换行符
Mar 26 PHP
探讨Smarty中如何获取数组的长度以及smarty调用php函数的详解
Jun 20 PHP
PHP中的Memcache详解
Apr 05 PHP
php单例模式实现方法分析
Mar 14 PHP
Linux系统递归生成目录中文件的md5的方法
Jun 29 PHP
php实现的mysqldb读写分离操作类示例
Feb 07 PHP
CI(CodeIgniter)框架实现图片上传的方法
Mar 24 PHP
PHP7扩展开发教程之Hello World实现方法示例
Aug 03 PHP
浅析PHP中的闭包和匿名函数
Dec 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
基于mysql的bbs设计(五)
2006/10/09 PHP
在windows服务器开启php的gd库phpinfo中未发现
2013/01/13 PHP
php获取中文拼音首字母类和函数分享
2014/04/24 PHP
PHP中__FILE__、dirname与basename用法实例分析
2014/12/01 PHP
php验证码实现代码(3种)
2015/09/07 PHP
php框架知识点的整理和补充
2021/03/01 PHP
JavaScript 继承详解(二)
2009/07/13 Javascript
多浏览器兼容的获取元素和鼠标的位置的js代码
2009/12/15 Javascript
更优雅的事件触发兼容
2011/10/24 Javascript
IE关闭时判断及AJAX注销案例学习
2013/02/18 Javascript
删除select中所有option选项jquery代码
2013/08/12 Javascript
判断一个对象是否为jquery对象的方法
2014/03/12 Javascript
JavaScript实现页面5秒后自动跳转的方法
2015/04/16 Javascript
Javascript小技能总结(推荐)
2016/06/02 Javascript
Vue.js每天必学之过渡与动画
2016/09/06 Javascript
jQuery实现的购物车物品数量加减功能代码
2016/11/16 Javascript
javascript 单例模式详解及简单实例
2017/02/14 Javascript
react实现pure render时bind(this)隐患需注意!
2017/03/09 Javascript
node.js自动上传ftp的脚本分享
2018/06/16 Javascript
微信小程序学习笔记之获取位置信息操作图文详解
2019/03/29 Javascript
Python实现判断给定列表是否有重复元素的方法
2018/04/11 Python
带你认识Django
2019/01/15 Python
对Django中内置的User模型实例详解
2019/08/16 Python
python词云库wordcloud的使用方法与实例详解
2020/02/17 Python
Python统计学一数据的概括性度量详解
2020/03/03 Python
Python视频编辑库MoviePy的使用
2020/04/01 Python
Oracle性能调优原则
2012/05/03 面试题
人力资源管理专业毕业生自我评价
2013/09/21 职场文书
2014年公务员思想汇报范文:全心全意为人民服务
2014/03/06 职场文书
毕业班联欢会主持词
2014/03/27 职场文书
小学国旗下的演讲稿
2014/08/28 职场文书
大学生党员个人剖析材料
2014/10/08 职场文书
抄袭同学作业检讨书1000字
2014/11/20 职场文书
青年岗位能手事迹材料
2014/12/23 职场文书
Html5生成验证码的示例代码
2021/05/10 Javascript
Windows Server 2016 配置 IIS 的详细步骤
2022/04/28 Servers