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连接SQLServer2005 的问题解决方法
Jul 19 PHP
fleaphp crud操作之findByField函数的使用方法
Apr 23 PHP
windows7下安装php的php-ssh2扩展教程
Jul 04 PHP
PHP+FFMPEG实现将视频自动转码成H264标准Mp4文件
Sep 24 PHP
PHP加密解密字符串汇总
Apr 26 PHP
php写入、删除与复制文件的方法
Jun 20 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
Oct 23 PHP
PHP实现基于文本的摩斯电码生成器
Jan 11 PHP
Laravel使用支付宝进行支付的示例代码
Aug 16 PHP
PHP类与对象后期静态绑定操作实例详解
Dec 20 PHP
Swoole源码中如何查询Websocket的连接问题详解
Aug 30 PHP
PHP执行linux命令6个函数代码实例
Nov 24 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+dbfile开发小型留言本
2006/10/09 PHP
Yii查询生成器(Query Builder)用法实例教程
2014/09/04 PHP
Windows下安装PHP单元测试环境PHPUnit图文教程
2014/10/24 PHP
php中Socket创建与监听实现方法
2015/01/05 PHP
YII使用url组件美化管理的方法
2015/12/28 PHP
PHP在线书签系统分享
2016/01/04 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
数组方法解决JS字符串连接性能问题有争议
2011/01/12 Javascript
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
2012/02/16 Javascript
疯狂Jquery第一天(Jquery学习笔记)
2012/05/11 Javascript
javascript实现通过表格绘制颜色填充矩形的方法
2015/04/21 Javascript
vue中如何引入jQuery和Bootstrap
2017/04/10 jQuery
Vuex简单入门
2017/04/19 Javascript
前端主流框架vue学习笔记第二篇
2017/07/26 Javascript
vue组件父子间通信详解(三)
2017/11/07 Javascript
AjaxUpLoad.js实现文件上传功能
2018/03/02 Javascript
jQuery实现的卷帘门滑入滑出效果【案例】
2019/02/18 jQuery
20个必会的JavaScript面试题(小结)
2019/07/02 Javascript
javascript之分片上传,断点续传的实际项目实现详解
2019/09/05 Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
2020/05/21 Javascript
JS写滑稽笑脸运动效果
2020/05/28 Javascript
通过JS判断网页是否为手机打开
2020/10/28 Javascript
Vue 事件的$event参数=事件的值案例
2021/01/29 Vue.js
python修改操作系统时间的方法
2015/05/18 Python
Python 3中print函数的使用方法总结
2017/08/08 Python
Python使用arrow库优雅地处理时间数据详解
2017/10/10 Python
对python遍历文件夹中的所有jpg文件的实例详解
2018/12/08 Python
Python编程中flask的简介与简单使用
2018/12/28 Python
基于python实现KNN分类算法
2020/04/23 Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
2020/02/24 Python
经典c++面试题三
2015/07/08 面试题
办公室前台岗位职责
2014/01/04 职场文书
打架检讨书50字
2014/01/11 职场文书
乡镇组织委员个人整改措施
2014/09/16 职场文书
廉洁自律心得体会2016
2016/01/13 职场文书