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 相关文章推荐
apache+php+mysql安装配置方法小结
Aug 01 PHP
php中smarty变量修饰用法实例分析
Jun 11 PHP
PHP的Socket通信之UDP通信实例
Jul 02 PHP
使用PHP进行微信公众平台开发的示例
Aug 21 PHP
示例详解Laravel重置密码代码重构
Aug 10 PHP
PHPStrom 新建FTP项目以及在线操作教程
Oct 16 PHP
浅谈socket同步和异步、阻塞和非阻塞、I/O模型
Dec 15 PHP
php正则判断是否为合法身份证号的方法
Mar 16 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
Sep 15 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
Sep 16 PHP
PHP 应用容器化以及部署方法
Feb 12 PHP
Laravel 框架路由原理与路由访问实例分析
Apr 14 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/10/09 PHP
基于HTTP长连接的"服务器推"技术的php 简易聊天室
2009/10/31 PHP
php park、unpark、ord 函数使用方法(二进制流接口应用实例)
2010/10/19 PHP
Laravel下生成验证码的类
2017/11/15 PHP
laravel 查询数据库获取结果实现判断是否为空
2019/10/24 PHP
Javascript 错误处理的几种方法
2009/06/13 Javascript
html5的自定义data-*属性和jquery的data()方法的使用示例
2013/08/21 Javascript
JQuery的ready函数与JS的onload的区别详解
2013/11/21 Javascript
JavaScript、jQuery与Ajax的关系
2016/01/24 Javascript
解析JavaScript面向对象概念中的Object类型与作用域
2016/05/10 Javascript
jQuery添加和删除输入文本框标签代码
2016/05/20 Javascript
js实现表单提交后不重新刷新当前页面
2016/11/30 Javascript
详解js中常规日期格式处理、月历渲染和倒计时函数
2016/12/28 Javascript
JavaScript解析JSON格式数据的方法示例
2017/01/24 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
vue中如何实现pdf文件预览的方法
2018/07/12 Javascript
vue实现一个获取按键展示快捷键效果的Input组件
2021/01/13 Vue.js
解析Python中while true的使用
2015/10/13 Python
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
2016/07/04 Python
正确理解python中的关键字“with”与上下文管理器
2017/04/21 Python
Python实现使用卷积提取图片轮廓功能示例
2018/05/12 Python
对python中的 os.mkdir和os.mkdirs详解
2018/10/16 Python
flask session组件的使用示例
2018/12/25 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
2019/08/23 Python
Python 过滤错误log并导出的实例
2019/12/26 Python
python实现控制台输出彩色字体
2020/04/05 Python
详解如何在PyCharm控制台中输出彩色文字和背景
2020/08/17 Python
Html5页面点击遮罩层背景关闭遮罩层
2020/11/30 HTML / CSS
SheIn俄罗斯:时尚女装网上商店
2017/02/28 全球购物
英国最大的纸工艺品商店:CraftStash
2018/12/01 全球购物
人事行政主管岗位职责
2013/12/22 职场文书
安全标语口号
2014/06/09 职场文书
个人典型事迹材料
2014/12/30 职场文书
圣诞晚会主持词开场白
2015/05/28 职场文书
2016年端午节校园广播稿
2015/12/18 职场文书
python和C/C++混合编程之使用ctypes调用 C/C++的dll
2022/04/29 Python