2010-06-22 98 views
2

我想将zip文件夹提取到某个位置并替换除几个文件和文件夹以外的所有文件和文件夹,我该怎么做?如何让ZipArchive不覆盖某些文件和文件夹

我目前执行以下操作。

$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(); 

我怎样才能把条件放在什么文件和文件夹不应该被替换?如果可以使用某种循环,那将会很棒。

感谢所有的帮助

回答

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方法采用第二个可选参数,它保存要提取的文件列表。

+0

该死的你维克多!你击败了我的拳击​​:)。 +1为一个干净的解决方案。 – 2010-06-22 12:01:59

+0

自从我做了PHP以来,已经有好几年了,是否有必要检查“if($ zip-> numFiles> 0)”? – 2010-06-22 12:03:30

+0

@Andre:实际上,并不是真的,不,在我们设想一些事情之前,这只是我的习惯。我缩短了一些代码。 – 2010-06-22 12:07:31

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)读取数据流,你就来信目标文件。