微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

教你在PHP ZipArchive解压缩时,去掉zip包里的多余目录层级

推荐:《PHP教程

写了个脚本,下载discuzQ,并解压到指定 git 仓储下,方便更新代码

遇到一个问题,在解压 uniapp 这个zip包时,里面多了一层目录包装,如果直接解压到指定目录,也会造成多了一级目录,如下图:

Laravel

那如何从zip包里解压,并去掉多余一层的目录 uniapp_v2.xxxx,可以看下面的 copy(zip://{$zipFile}#{$filename}, $newFileName);

<?PHP

set_time_limit(0);
$config = (object)[
    'zips'    => __DIR__ . '/zips',
    'uniapp'  => __DIR__ . '/uniapp',
];

downloadAndExtract('https://dl.discuz.chat/uniapp_latest.zip', 'uniapp');

function downloadAndExtract($zipUrl, $key)
{
    global $config;

    echo 正在下载: $zipUrl\n;
    $zipData = file_get_contents($zipUrl);
    $zipFile = $config->zips . /$key- . date('Ymd-His') . '.zip';
    file_put_contents($zipFile, $zipData);

    echo 正在解压到 {$config->$key} \n;
    $zip = new ZipArchive;

    if ($key === 'uniapp') {
        if ($zip->open($zipFile) === true) {
            $folder = $zip->getNameIndex(0);
            for ($i = 1; $i < $zip->numFiles; $i++) {
                $filename = $zip->getNameIndex($i);
                if (substr($filename, -1, 1) === '/') {
                    continue;
                }

                // $folder like => uniapp_v2.1.201029/
                // $filename like => uniapp_v2.1.201029/commitlint.config.js
                $newFileName = $config->$key . '/' . str_replace($folder, '', $filename);
                if (!file_exists(dirname($newFileName))) {
                    mkdir(dirname($newFileName), 0644, true);
                }
                copy(zip://{$zipFile}#{$filename}, $newFileName);
            }
            $zip->close();
        }
    } 

    echo -------------- SUCESS --------------\n;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐