PHP教程:PHP ZipArchive解壓縮時去掉zip包裏的多餘目錄層級

寫了個腳本,下載discuzQ,並解壓到指定 git 倉儲下,方便更新代碼。
遇到一個問題,在解壓 uniapp 這個zip包時,裏面多了一層目錄包裝,如果直接解壓到指定目錄,也會造成多了一級目錄,如下圖:

那如何從zip包裏解壓,並去掉多餘一層的目錄 uniapp_v2.xxxx,可以看下面的 copy("zip://{$zipFile}#{$filename}", $newFileName);

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";
}

以上就是教你在PHP ZipArchive解壓縮時,去掉zip包裏的多餘目錄層級的詳細內容,更多請關注php菜鳥博客其它相關文章!

原文來源:https://www.php.cn/php-weizijiaocheng-462541.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章