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基础知识:控制结构
Dec 13 PHP
ubuntu 编译安装php 5.3.3+memcache的方法
Aug 05 PHP
PHP中is_file()函数使用指南
May 08 PHP
php将金额数字转化为中文大写
Jul 09 PHP
详解js异步文件加载器
Jan 24 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
Jul 20 PHP
PHP基于自定义类随机生成姓名的方法示例
Aug 05 PHP
原生JS实现Ajax通过POST方式与PHP进行交互的方法示例
May 12 PHP
thinkPHP5框架auth权限控制类与用法示例
Jun 12 PHP
laravel 事件/监听器实例代码
Apr 12 PHP
yii2 开发api接口时优雅的处理全局异常的方法
May 14 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
Oct 12 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
MySQL数据源表结构图示
2008/06/05 PHP
PHP 判断变量类型实现代码
2009/10/23 PHP
PHP获取一年中每个星期的开始和结束日期的方法
2015/02/12 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
2015/03/03 PHP
PHP实现微信网页授权开发教程
2016/01/19 PHP
用Javascript同时提交多个Web表单的方法
2009/12/26 Javascript
JS对象与JSON格式数据相互转换
2012/02/20 Javascript
jQuery toggleClass应用实例(附效果图)
2014/04/06 Javascript
JavaScript插件化开发教程 (二)
2015/01/27 Javascript
javascript与css3动画结合使用小结
2015/03/11 Javascript
浅析AngularJS Filter用法
2015/12/28 Javascript
JS iFrame加载慢怎么解决
2016/05/13 Javascript
jQuery学习之DOM节点的插入方法总结
2017/01/22 Javascript
JS获取本周周一,周末及获取任意时间的周一周末功能示例
2017/02/09 Javascript
js实现一个猜数字游戏
2017/03/31 Javascript
Angularjs中date过滤器失效的问题及解决方法
2018/07/06 Javascript
[50:21]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/19 DOTA
[04:03][TI9趣味短片] 小鸽子茶话会
2019/08/20 DOTA
python解析模块(ConfigParser)使用方法
2013/12/10 Python
Python中的推导式使用详解
2015/06/03 Python
Python实现保证只能运行一个脚本实例
2015/06/24 Python
python开发之str.format()用法实例分析
2016/02/22 Python
python实现感知器
2017/12/19 Python
html5 横向滑动导航栏的方法示例
2020/05/08 HTML / CSS
美国派对用品及装饰品网上商店:Shindigz
2016/07/30 全球购物
澳大利亚最大的网上油画销售画廊:Direct Art Australia
2018/04/15 全球购物
英国婴儿及儿童产品商店:TigerParrot
2019/03/04 全球购物
C#笔试题
2015/07/14 面试题
2014年语文教研组工作总结
2014/12/06 职场文书
廉政承诺书
2015/01/19 职场文书
2015年质检工作总结
2015/05/04 职场文书
电子表的操作介绍说明书
2019/10/28 职场文书
TensorFlow中tf.batch_matmul()的用法
2021/06/02 Python
MySQL之MyISAM存储引擎的非聚簇索引详解
2022/03/03 MySQL
Android Flutter实现3D动画效果示例详解
2022/04/07 Java/Android
使用Python开发冰球小游戏
2022/04/30 Python