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 相关文章推荐
用文本作数据处理
Oct 09 PHP
PHP配置文件中最常用四个ini函数
Mar 19 PHP
用PHP连接MySQL代码的参数说明
Jun 07 PHP
php 启动报错如何解决
Jan 17 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
Mar 04 PHP
PHP时间戳格式全部汇总 (获取时间、时间戳)
Jun 13 PHP
全面了解PHP中的全局变量
Jun 17 PHP
微信网页授权(OAuth2.0) PHP 源码简单实现
Aug 29 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
Nov 14 PHP
PHP调用接口用post方法传送json数据的实例
May 31 PHP
微信公众平台开发教程①获取用户Openid及个人信息图文详解
Apr 10 PHP
php中array_fill函数的实例用法
Mar 02 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 7 vs HHVM 多角度比较
2016/02/14 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
Prototype使用指南之hash.js
2007/01/10 Javascript
javascript fullscreen全屏实现代码
2009/04/09 Javascript
javascript 关闭IE6、IE7
2009/06/01 Javascript
JQuery下关于$.Ready()的分析
2009/12/13 Javascript
JavaScript字符串插入、删除、替换函数使用示例
2013/07/25 Javascript
Javascript实现Web颜色值转换
2015/02/05 Javascript
node.js调用C++开发的模块实例
2015/07/03 Javascript
浅谈JavaScript 函数参数传递到底是值传递还是引用传递
2016/08/23 Javascript
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
JavaScript+Canvas实现彩色图片转换成黑白图片的方法分析
2018/07/31 Javascript
微信小程序scroll-view实现滚动穿透和阻止滚动的方法
2018/08/20 Javascript
vue.js this.$router.push获取不到params参数问题
2020/03/03 Javascript
微信小程序实现比较功能的方法汇总(五种方法)
2020/03/07 Javascript
[51:00]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
在Python的Flask框架中使用日期和时间的教程
2015/04/21 Python
用python统计代码行的示例(包括空行和注释)
2018/07/24 Python
Python pyinotify模块实现对文档的实时监控功能方法
2018/10/13 Python
分析经典Python开发工程师面试题
2019/04/08 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
2019/11/19 Python
Python 中如何实现参数化测试的方法示例
2019/12/10 Python
浅析python 定时拆分备份 nginx 日志的方法
2020/04/27 Python
Python字符串格式化常用手段及注意事项
2020/06/17 Python
详解python 条件语句和while循环的实例代码
2020/12/28 Python
CSS3新增布局之: flex详解
2020/06/18 HTML / CSS
佛罗里达州印第安河新鲜水果:Hale Groves
2017/02/20 全球购物
乌克兰电子和家用电器商店:Foxtrot
2019/07/23 全球购物
人力资源经理的岗位职责范本
2014/02/28 职场文书
节水倡议书范文
2014/04/15 职场文书
少先队活动总结
2014/08/29 职场文书
2015元旦晚会主持词(开场白+结束语)
2014/12/14 职场文书
大学生就业推荐表自我评价
2015/03/02 职场文书
活着观后感
2015/06/03 职场文书