zoukankan      html  css  js  c++  java
  • php生成zip压缩文件的方法,支持文件和压缩包路径查找

    /*
    *    new creatZip($_dir,$_zipName);
    *@ _dir是被压缩的文件夹名称,可使用路径,例 'a'或者'a/test.txt'或者'test.txt'
    *@ _zipName是压缩后的压缩包名称,可使用路径,例 'a/test.zip'或者'test.zip'
    **/
    class creatZip {
        private $_dir;
        private $_zipDir;
        private $_zipName;
        
        public function __construct($dir,$zipName) {
            $this->_dir = $dir;
            $this->_zipDir = basename($dir);
            $this->_zipName = $zipName;
            $this->mkdirs();
            $this->creat();
        }
        //检测并生成目录
        private function mkdirs() {
            if (!is_dir(dirname($this->_zipName))) {
                $arr = explode('/', dirname($this->_zipName));
                $arrs = '';
                foreach($arr as $value) {
                    if (!is_dir($arrs.$value)) {
                        if (!!mkdir($arrs.$value)) {
                            $arrs .= $value.'/';
                        }
                    }
                }
            }
        }
        //生成Zip压缩包
        private function creat() {
            $zip = new ZipArchive;
            if (is_dir($this->_dir)) {
                $this->readDir($this->_dir,$files);
                if ($zip->open($this->_zipName,ZipArchive::CREATE)) {
                    foreach ($files as $value) {
                        preg_match('//('.$this->_zipDir.'/.*)/', $value, $match);
                        if (is_dir($value)) {
                            @$zip->addEmptyDir($value, $match[1]);
                        } else {
                            @$zip->addFile($value, $match[1]);
                        }
                    }
                    $zip->close();
                }
            } else {
                if ($zip->open($this->_zipName,ZipArchive::CREATE)) {
                    $zip->addFile($this->_dir, basename($this->_dir));
                }
            }
        }
        //读取文件夹所有文件
        private function readDir($dir,&$arr) {
            if ($dirs = opendir($dir)) {
                while (($file=readdir($dirs)) != false) {
                    if ($file == '.' || $file == '..') continue;
                    $files = $dir .'/'. $file;
                    if (is_dir($files) && $this->isEmpty($files)) {
                        $this->readDir($files,$arr);
                    } else {
                        $arr[] = $files;
                    }
                }
            }
            closedir($dirs);
        }
        //判断文件夹是否为空
        private function isEmpty($dir) {
            if ($_dirs = opendir($dir)) {
                while (($file=readdir($dirs)) != false) {
                    if($file != '.' && $file != '..') {
                        closedir($dirs);
                        return true;
                        break;
                    }
                }
                closedir($dirs);
                return false;
            }
        }
    }

    本文来源于王业楼的个人博客 本文地址:http://www.ly89.cn/detailB/50.html

    欢迎分享本文,转载请注明本文出处和地址

  • 相关阅读:
    gitlab 启用HTTPS
    centos7 部署 汉化版 gitlab 10.0.2
    前端常见跨域解决方案(全)
    [转]用python爬虫抓站的一些技巧总结 zz
    【转】通用权限管理设计 之 数据权限
    【转】通用权限管理设计 之 功能权限设计
    JavaScript数据结构和算法
    Vue.js 插件开发详解
    wdcpV3面板安装ssl证书 apache教程 子站SSL配置
    [POJ-2823] -Sliding Window
  • 原文地址:https://www.cnblogs.com/ly89cn/p/4855814.html
Copyright © 2011-2022 走看看