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中通过ADO调用Asscess数据库和COM程序
Oct 09 PHP
dedecms 制作模板中使用的全局标记图文教程
Mar 11 PHP
PHP常用的文件操作函数经典收藏
Apr 02 PHP
php使用json_encode对变量json编码
Apr 07 PHP
基于PHP的简单采集数据入库程序
Jul 30 PHP
yii的CURD操作实例详解
Dec 04 PHP
php找出指定范围内回文数且平方根也是回文数的方法
Mar 23 PHP
WIFI万能钥匙密码查询接口实例
Sep 28 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
Feb 09 PHP
YII2框架中excel表格导出的方法详解
Jul 21 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
Mar 01 PHP
php使用redis的有序集合zset实现延迟队列应用示例
Feb 20 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实现域名whois查询的代码(数据源万网、新网)
2010/02/22 PHP
PHP实现下载功能的代码
2012/09/29 PHP
php导入导出excel实例
2013/10/25 PHP
php生成rss类用法实例
2015/04/14 PHP
php把大写命名转换成下划线分割命名
2015/04/27 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
laravel 如何实现引入自己的函数或类库
2019/10/15 PHP
JavaScript进阶教程(第四课第一部分)
2007/04/05 Javascript
JS在textarea光标处插入文本的小例子
2013/03/22 Javascript
jquery+html5时钟特效代码分享(可设置闹钟并且语音提醒)
2020/03/30 Javascript
关于function类中定义变量this的简单说明
2016/05/28 Javascript
页面get请求 中文参数方法乱码问题的快速解决方法
2016/05/31 Javascript
巧用Javascript的逻辑运算符
2016/12/02 Javascript
脚本div实现拖放功能(两种)
2017/02/13 Javascript
浅谈在Vue.js中如何实现时间转换指令
2019/01/06 Javascript
基于js实现数组相邻元素上移下移
2020/05/19 Javascript
vue 清空input标签 中file的值操作
2020/07/21 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
2020/07/28 Javascript
JavaScript Html实现移动端红包雨功能页面
2021/01/10 Javascript
python将秒数转化为时间格式的实例
2018/09/16 Python
Python构建图像分类识别器的方法
2019/01/12 Python
pycharm配置pyqt5-tools开发环境的方法步骤
2019/02/11 Python
scrapy-redis源码分析之发送POST请求详解
2019/05/15 Python
关于windows下Tensorflow和pytorch安装教程
2020/02/04 Python
Python argparse模块使用方法解析
2020/02/20 Python
Jupyter notebook 远程配置及SSL加密教程
2020/04/14 Python
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
2016/08/15 HTML / CSS
竞聘报告优秀范文
2014/11/06 职场文书
创先争优活动个人总结
2015/03/04 职场文书
房地产销售员岗位职责
2015/04/11 职场文书
校车司机安全责任书
2015/05/11 职场文书
党员反四风学习心得体会
2016/01/22 职场文书
2016年优秀共产党员先进事迹材料
2016/02/29 职场文书
mysql查询结果实现多列拼接查询
2022/04/03 MySQL
Redis实战高并发之扣减库存项目
2022/04/14 Redis
JS实现简单九宫格抽奖
2022/06/28 Javascript