2010-06-22 84 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)讀取數據流,你就來信目標文件。