You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ZipArchive::addFile生成的压缩包Windows有目录Linux解压扁平化如何解决

问题根源

你在Windows环境下生成ZIP包时,写入压缩包的文件路径使用了Windows专属的反斜杠\作为分隔符。ZIP格式规范明确要求跨平台兼容的路径需使用正斜杠/作为分隔符,Linux系统下的解压工具会将反斜杠识别为普通文件名的一部分,而非目录分层标志,因此所有文件都会被当作无目录的单文件直接解压到当前目录,出现扁平化问题。WinRAR对Windows路径做了兼容处理,所以解压正常。

修复方案

只需要在写入相对路径到压缩包前,将所有反斜杠替换为标准正斜杠即可:

function compress(string $path)
{
    $zip = new ZipArchive();
    $zip->open(dirname(SOURCE_PATH, 1) . '\\' . explode('\\', SOURCE_PATH)[count(explode('\\', SOURCE_PATH)) - 2] . '.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);

    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::LEAVES_ONLY);

    foreach ($files as $file) {
        if (!$file->isDir()) {
            $real = $file->getRealPath();
            $relative = substr($real, strlen($path));
            // 替换路径分隔符为ZIP标准正斜杠,兼容全平台
            $relative = str_replace('\\', '/', $relative);
            $zip->addFile($real, $relative);
        }
    }

    $zip->close();
}

修改后生成的压缩包可同时在Windows、Linux环境下正常解压并保留目录结构。

内容的提问来源于stack exchange,提问作者Faye D.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:27:02