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 相关文章推荐
php SQL之where语句生成器
Mar 24 PHP
PHP IF ELSE简化/三元一次式的使用
Aug 22 PHP
PHP执行Curl时报错提示CURL ERROR: Recv failure: Connection reset by peer的解决方法
Jun 26 PHP
PHP在网页中动态生成PDF文件详细教程
Jul 05 PHP
Smarty中调用FCKeditor的方法
Oct 27 PHP
如何使用GDB调试PHP程序
Dec 08 PHP
zen_cart实现支付前生成订单的方法
May 06 PHP
thinkphp3.x中display方法及show方法的用法实例
May 19 PHP
PHP请求Socket接口测试实例
Aug 12 PHP
PHP将身份证正反面两张照片合成一张图片的代码
Apr 08 PHP
PHP设计模式之原型设计模式原理与用法分析
Apr 25 PHP
PHP bin2hex()函数基础实例讲解
Feb 11 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
PHP 观察者模式的实现代码
2013/05/10 PHP
PHP生成不重复标识符的方法
2014/11/21 PHP
jQuery.extend()的实现方式详解及实例
2013/06/29 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
JS+CSS实现一个气泡提示框
2013/08/18 Javascript
Javascript中this的用法详解
2014/09/22 Javascript
28个常用JavaScript方法集锦
2015/01/14 Javascript
JS实现自动定时切换的简洁网页选项卡效果
2015/10/13 Javascript
jQuery可见性过滤选择器用法示例
2016/09/09 Javascript
jQuery插件zTree实现的多选树效果示例
2017/03/08 Javascript
详解Angular2学习笔记之Html属性绑定
2018/01/03 Javascript
浅谈vue中.vue文件解析流程
2018/04/24 Javascript
axios实现简单文件上传功能
2019/09/25 Javascript
Vue.js中Line第三方登录api的实现代码
2020/06/29 Javascript
three.js 制作动态二维码的示例代码
2020/07/31 Javascript
JS实现小米轮播图
2020/09/21 Javascript
vue pages 多入口项目 + chainWebpack 全局引用缩写说明
2020/09/21 Javascript
原生JavaScript实现留言板
2021/01/10 Javascript
python实现的udp协议Server和Client代码实例
2014/06/04 Python
python在linux系统下获取系统内存使用情况的方法
2015/05/11 Python
python实现淘宝秒杀聚划算抢购自动提醒源码
2020/06/23 Python
PyPDF2读取PDF文件内容保存到本地TXT实例
2020/05/12 Python
Manuka Doctor美国官网:麦卢卡蜂蜜和蜂毒护肤
2016/12/25 全球购物
Pottery Barn阿联酋:购买家具、家居装饰及更多
2019/12/08 全球购物
经典c++面试题六
2012/01/18 面试题
求职者简历中的自我评价
2013/10/20 职场文书
公司离职证明样本
2014/09/13 职场文书
确保工程质量承诺书
2015/04/29 职场文书
工作汇报材料难写?方法都在这里了!
2019/07/01 职场文书
多表查询、事务、DCL
2021/04/05 MySQL
详解Python描述符的工作原理
2021/06/11 Python
Unity连接MySQL并读取表格数据的实现代码
2021/06/20 MySQL
详解Python为什么不用设计模式
2021/06/24 Python
铁头也玩根德 YachtBoy YB-230......
2022/04/05 无线电
python的html标准库
2022/04/29 Python
Zabbix对Kafka topic积压数据监控的问题(bug优化)
2022/07/07 Servers