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 循环列出目录内容的函数代码
May 26 PHP
FirePHP 推荐一款PHP调试工具
Apr 23 PHP
PHP去掉从word直接粘贴过来的没有用格式的函数
Oct 29 PHP
php 批量添加多行文本框textarea一行一个
Jun 03 PHP
在Linux系统的服务器上隐藏PHP版本号的方法
Jun 06 PHP
10个超级有用的PHP代码片段果断收藏
Sep 23 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
Mar 22 PHP
php blowfish加密解密算法
Jul 02 PHP
YII2 实现多语言配置的方法分享
Jan 11 PHP
PHP实现对数组分页处理实例详解
Feb 07 PHP
php对象工厂类完整示例
Aug 09 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
Oct 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
ThinkPHP的Widget扩展实例
2014/06/19 PHP
基于PHP的简单采集数据入库程序
2014/07/30 PHP
thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
2016/05/19 PHP
laravel框架 api自定义全局异常处理方法
2019/10/11 PHP
javascript 冒号 使用说明
2009/06/06 Javascript
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
JQuery切换显示的效果实例代码
2013/02/27 Javascript
JavaScript地图拖动功能SpryMap的简单实现
2013/07/17 Javascript
Node.js安装教程和NPM包管理器使用详解
2014/08/16 Javascript
基于JavaScript实现TAB标签效果
2016/01/12 Javascript
AngularJs 弹出模态框(model)
2016/04/07 Javascript
JS两个数组比较,删除重复值的巧妙方法(推荐)
2016/06/03 Javascript
基于JavaScript实现鼠标箭头移动图片跟着移动
2016/08/30 Javascript
chrome下判断点击input上标签还是其余标签的实现方法
2016/09/18 Javascript
JS条形码(一维码)插件JsBarcode用法详解【编码类型、参数、属性】
2017/04/19 Javascript
javascript 开发之网页兼容各种浏览器
2017/09/28 Javascript
详解Vue2 添加对scss的支持
2019/01/02 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
2019/08/27 Javascript
解决Vue项目中tff报错的问题
2020/10/21 Javascript
微信小程序绘制半圆(弧形)进度条
2020/11/18 Javascript
利用node.js开发cli的完整步骤
2020/12/29 Javascript
Python备份Mysql脚本
2008/08/11 Python
简化Python的Django框架代码的一些示例
2015/04/20 Python
基于python实现文件加密功能
2020/01/06 Python
python可迭代对象去重实例
2020/05/15 Python
python搜索算法原理及实例讲解
2020/11/18 Python
Sofmap官网:日本著名的数码电器专卖店
2017/05/19 全球购物
.NET remoting的两种通道是什么
2016/05/31 面试题
教学器材管理制度
2014/01/26 职场文书
伊索寓言教学反思
2014/05/01 职场文书
群众路线自我剖析材料
2014/10/08 职场文书
个人批评与自我批评范文
2014/10/17 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
三八节祝酒词
2015/08/11 职场文书
Python基础之Socket通信原理
2021/04/22 Python
分析ZooKeeper分布式锁的实现
2021/06/30 Java/Android