我有一个PHP脚本,使用找到的代码here来压缩目录(及其所有子目录和文件)。我修改了代码以使用$zip->addFile()
而不是$zip->addFromString
和file_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可以处理该文件。