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 相关文章推荐
用cookies来跟踪识别用户
Oct 09 PHP
php懒人函数 自动添加数据
Jun 28 PHP
比file_get_contents稳定的curl_get_contents分享
Jan 11 PHP
PHP调用Linux的命令行执行文件压缩命令
Jan 27 PHP
跟我学Laravel之请求(Request)的生命周期
Oct 15 PHP
ThinkPHP查询语句与关联查询用法实例
Nov 01 PHP
php中使用base HTTP验证的方法
Apr 20 PHP
两种php实现图片上传的方法
Jan 22 PHP
Yii2单元测试用法示例
Nov 12 PHP
Laravel5框架自定义错误页面配置操作示例
Apr 17 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
Feb 27 PHP
PHP使用Http Post请求发送Json对象数据代码解析
Jul 16 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语法速查表
2006/12/06 PHP
PHP用SAX解析XML的实现代码与问题分析
2011/08/22 PHP
PHP使用CURL实现多线程抓取网页
2015/04/30 PHP
JQuery UI皮肤定制
2009/07/27 Javascript
JavaScript学习笔记(十)
2010/01/17 Javascript
原生js写的放大镜效果
2012/08/22 Javascript
jQuery封装的tab选项卡插件分享
2015/06/16 Javascript
javascript实现类似百度分享功能的方法
2015/07/27 Javascript
获取阴历(农历)和当前日期的js代码
2016/02/15 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
2016/06/30 Javascript
Angular设置title信息解决SEO方面存在问题
2016/08/19 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
2017/04/01 Javascript
ES6入门教程之Class和Module详解
2017/05/17 Javascript
10行原生JS实现文字无缝滚动(超简单)
2018/01/02 Javascript
nginx+vue.js实现前后端分离的示例代码
2018/02/12 Javascript
JS实现前端页面的搜索功能
2018/06/12 Javascript
详解Node.js异步处理的各种写法
2019/06/09 Javascript
原生js+canvas实现下雪效果
2020/08/02 Javascript
原生JavaScript实现弹幕组件的示例代码
2020/10/12 Javascript
[00:33]DOTA2上海特级锦标赛 CDEC战队宣传片
2016/03/04 DOTA
python开启多个子进程并行运行的方法
2015/04/18 Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
2017/05/08 Python
python 定义n个变量方法 (变量声明自动化)
2018/11/10 Python
Python异步编程之协程任务的调度操作实例分析
2020/02/01 Python
TensorFlow基本的常量、变量和运算操作详解
2020/02/03 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
2020/02/26 Python
Europcar美国/加拿大:预订汽车或卡车租赁服务
2018/11/13 全球购物
Charles&Keith美国官方网站:新加坡快时尚鞋类和配饰零售商
2019/11/27 全球购物
幼儿园教育教学反思
2014/01/31 职场文书
农业局学习党的群众路线教育实践活动心得体会
2014/03/07 职场文书
法制宣传日活动总结
2014/04/29 职场文书
安全演讲稿大全
2014/05/09 职场文书
无房证明范本
2014/09/17 职场文书
教师工作失职检讨书
2014/09/18 职场文书
Python爬虫之用Xpath获取关键标签实现自动评论盖楼抽奖(二)
2021/06/07 Python
PostgreSQL自动更新时间戳实例代码
2021/11/27 PostgreSQL