当使用Windows打开时,PHP创建的Zip文件包含与目录同名的空文件

时间:2014-01-08 22:20:05

标签: php windows zip

我有一个PHP脚本,使用找到的代码here来压缩目录(及其所有子目录和文件)。我修改了代码以使用$zip->addFile()而不是$zip->addFromStringfile_get_contents,因为我正在压缩大型目录(数百MB),这些方法很快就会超出我的php内存限制(设置为128M) )。我修改过的代码是:

function Zip($source, $destination)
{
    if (!extension_loaded('zip') || !file_exists($source)) {
        return false;
    }

    $zip = new ZipArchive();
    if (!$zip->open($destination, ZIPARCHIVE::OVERWRITE)) {
        return false;
    }

    $source = str_replace('\\', '/', realpath($source));

    if (is_dir($source) === true)
    {
        $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);

        foreach ($files as $file){
            $file = str_replace('\\', '/', $file);

            // Ignore "." and ".." folders
            if( in_array(substr($file, strrpos($file, '/')+1), array('.', '..')) )
                continue;

            $file = realpath($file);

            if (is_dir($file) === true){
                $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
            }else if (is_file($file) === true){
                $zip->addFile($file, str_replace($source . '/', '', $file);
            }
        }
    }
    else if (is_file($source) === true){
        $zip->addFile($source, basename($source));
    }

    return $zip->close();
}

此代码在压缩文件方面做了令人钦佩的工作。我使用一些HTTP标头来重定向浏览器以下载zip文件;这也很有效。在我解压缩下载的.zip文件之前,我遇到的问题不会出现。在Linux和OS X上,文件正常下载和解压缩;没有异常。但是,当我尝试在Windows Vista中解压缩这些.zip文件时,zip文件中有额外的文件。

例如,如果我压缩了具有结构

的目录
- topDir (directory)
    - subDir (directory)
        - pic.jpg (file)

Windows在zip文件中显示了这个结构:

- topDir (directory)
- topDir (file, size = 0 bytes)
    - subDir (directory)
    - subDir (file, size = 0 bytes)
        - pic.jpg (file)

我不明白这些幻像文件的来源。它们不会成为问题,但是当Windows尝试解压缩并查找具有相同名称的文件和目录时,它会感到困惑。有关他们来自哪里的任何想法?我只尝试过Windows的默认压缩应用程序;可能是7zip可以处理该文件。

0 个答案:

没有答案