如何让ZipArchive不会覆盖某些文件和文件夹

时间:2010-06-22 11:37:18

标签: php zip

我想将zip文件夹解压缩到一个位置并替换除少数文件和文件夹之外的所有文件和文件夹,我该怎么做?

我目前正在做以下事情。

$backup = realpath('./backup/backup.zip');

$zip = new ZipArchive();

if ($zip->open("$backup", ZIPARCHIVE::OVERWRITE) !== TRUE) {

    die ('Could not open archive');

}

$zip->extractTo('minus/');

$zip->close();

如何为不应更换的文件和文件夹添加条件?如果可以使用某种循环那将是很好的。

感谢大家的帮助

2 个答案:

答案 0 :(得分:7)

你可以做这样的事情,我测试了它,它适用于我:

// make a list of all the files in the archive
$entries = array();
for ($idx = 0; $idx < $zip->numFiles; $idx++) {
    $entries[] = $zip->getNameIndex($idx);
}

// remove $entries for the files you don't want to overwrite

// only extract the remaining $entries
$zip->extractTo('minus/', $entries);

此解决方案基于 numFiles 属性和getNameIndex方法,即使将存档结构化为子文件夹也可以使用(条目看起来像/ folder / subfolder / file .EXT)。 此外,extractTo方法采用第二个可选的paramer来保存要提取的文件列表。

答案 1 :(得分:0)

如果您只想从存档中提取特定文件(并且您知道它们是什么),那么请使用第二个参数(条目)。

 $zip->extractTo('minus/', array('file1.ext', 'newfile2.xml'));

如果要提取所有不存在的文件,可以尝试以下操作之一:

$files = array();

for($i = 0; $i < $zip->numFiles; $i++) {
    $filename = $zip->getNameIndex($i);
    // if $filename not in destination / or whatever the logic is then
        $files[] = $filename;
}
$zip->extractTo($path, $files);      
$zip->close();

您还可以使用$zip->getStream( $filename )读取您随后写入目标文件的流。