php 压缩文件类,支持递归添加文件目录,支持空目录,支持中文路径及文件名

 PHP进阶  2018-10-07  admin  1912  2581

php 压缩文件类,支持递归添加文件目录,支持空目录,支持中文路径及文件名

<?php
//使用示例
$path = 'D:/aaa/bbb/aaa.txt';
$path = 'D:/aaa/bbb';
ZipClass::runZip($path);


/**
 * php 压缩文件类,支持递归添加文件目录,支持空目录,支持中文路径及文件名
 * Class ZipClass
 */
class ZipClass
{

    /**
     * @param $path  目录或文件绝对路径
     * @param string $zipname 压缩文件的路径
     */
    public static function runZip($path, $zipname = '')
    {
        $zipname = empty($zipname) ? $path . '.zip' : $zipname;
        $path = str_replace('\\', '/', $path);
        $zip = new \ZipArchive();
        //if ($zip->open($zipname, \ZIPARCHIVE::CREATE)===true || $zip->open($zipname, \ZIPARCHIVE::OVERWRITE)===true) {
        if (is_file($zipname)) {
            //unlink($zipname);
            $zip->open($zipname, \ZIPARCHIVE::OVERWRITE);
        } else {
            $zip->open($zipname, \ZIPARCHIVE::CREATE);
        }

        if (is_file($path)) {
            $pathArr = explode('/', $path);
            $zip->addFile($path, end($pathArr));
        } else {
            //调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法
            static::addFileToZip($path, $zip, strlen($path));
        }
        $zip->close(); //关闭处理的zip文件
    }

    /**
     * @param $path 压缩文件目录路径
     * @param $zip  ZipArchive的对象
     * @param int $len 去除原始文件路径
     */
    public static function addFileToZip($path, $zip, $len = 0)
    {
        //$path = str_replace('\\', '/', $path);
        //打开当前文件夹由$path指定
        $handler = opendir($path);
        while (($filename = readdir($handler)) !== false) {
            //文件夹文件名字为'.'和‘..',不要对他们进行操作
            if ($filename != "." && $filename != "..") {
                if (is_dir($path . "/" . $filename)) {
                    //添加空目录
                    $zip->addFromString(substr($path . "/" . $filename . '/', $len + 1), null);
                    //如果读取的某个对象是文件夹,则递归
                    static::addFileToZip($path . "/" . $filename, $zip, $len);
                } else {
                    $file3 = $path . "/" . $filename;
                    $file4 = substr($file3, $len + 1);
                    //将文件加入zip对象
                    $zip->addFile($path . "/" . $filename, $file4);
                }
            }
        }
        @closedir($path);
    }


}


如果文章对您有帮助,点击下方的广告,支持一下作者吧!

相关推荐


点名工具,抽奖软件

点名工具,抽奖软件

go 递归读取目录中所有文件和目录 读取当前目录的文件和目录

递归读取目录中所有文件和目录//ReadDirAll递归读取目录中所有文件和目录 funcReadDirAll(pathstring)([]string,error){ varfiles[]string err:=filepath.Walk(path,func(pathstring,infoos.FileInfo,errerror)error{ iferr!=nil{ re

go 递归读取目录,并生成树形结构的数据

go 递归读取目录,并生成树形结构的数据//读取目录中的所有文件,如果是目录则递归读取,生成结构化的树形struct packagemain import( &quot;encoding/json&quot; &quot;fmt&quot; &quot;os&quot; &quot;path/filepath&quot; ) //TreeNode文件的树形结构体 ty

绚丽的倒计时软件

绚丽的倒计时软件