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控制用户的浏览器--ob*函数的使用说明
Mar 16 PHP
C# Assembly类访问程序集信息
Jun 13 PHP
PHP 日期加减的类,很不错
Oct 10 PHP
PHP中Date()时间日期函数的使用方法小结
Apr 20 PHP
PHP中图片等比缩放的实例
Mar 24 PHP
限制ckeditor上传图片文件大小的方法
Nov 15 PHP
typecho插件编写教程(六):调用接口
May 28 PHP
php使用curl打开https网站的方法
Jun 17 PHP
php使用parse_str实现查询字符串解析到变量中的方法
Feb 17 PHP
使用XHProf查找PHP性能瓶颈的实例
Dec 13 PHP
php + WebUploader实现图片批量上传功能
May 06 PHP
PHP实现获取url地址中顶级域名的方法示例
Jun 05 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
长波有什么东西
2021/03/01 无线电
php中session定期自动清理的方法
2015/11/12 PHP
php简单实现多维数组排序的方法
2016/09/30 PHP
PHP笛卡尔积实现算法示例
2018/07/30 PHP
arguments对象
2006/11/20 Javascript
jQuery列表拖动排列具体实现
2013/11/04 Javascript
javascript数据类型示例分享
2015/01/19 Javascript
setinterval()与clearInterval()JS函数的调用方法
2015/01/21 Javascript
JS自动倒计时30秒后按钮才可用(两种场景)
2015/08/31 Javascript
基于javascript实现全屏漂浮广告
2016/03/31 Javascript
再谈Javascript中的异步以及如何异步
2016/08/19 Javascript
javascript中获取元素标签中间的内容的实现方法
2016/10/08 Javascript
jquery广告无缝轮播实例
2017/01/05 Javascript
p5.js入门教程之鼠标交互的示例
2018/03/16 Javascript
对angularJs中2种自定义服务的实例讲解
2018/09/30 Javascript
Javascript数组方法reduce的妙用之处分享
2019/06/10 Javascript
重学JS之显示强制类型转换详解
2019/06/30 Javascript
[59:08]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第一局
2016/02/27 DOTA
使用python实现拉钩网上的FizzBuzzWhizz问题示例
2014/05/05 Python
用Python计算三角函数之acos()方法的使用
2015/05/15 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
python实现ID3决策树算法
2018/08/29 Python
python多进程间通信代码实例
2019/09/30 Python
postman和python mock测试过程图解
2020/02/22 Python
新建文件时Pycharm中自动设置头部模板信息的方法
2020/04/17 Python
阿巴庭院:Abba Patio
2019/06/18 全球购物
写出一个方法实现冒泡排序
2016/07/08 面试题
机械设计及其自动化专业推荐信
2013/10/31 职场文书
护理专科毕业推荐信
2013/11/10 职场文书
自我评价中英文语句
2013/11/30 职场文书
带病坚持工作事迹
2014/05/03 职场文书
转让协议书范本
2014/09/13 职场文书
2015年国际护士节演讲稿
2015/03/18 职场文书
采购部2015年度工作总结
2015/07/24 职场文书
OpenCV项目实践之停车场车位实时检测
2022/04/11 Python
css3 选择器
2022/05/11 HTML / CSS