Как получить ZipArchive, чтобы не перезаписывать определенные файлы и папки - PullRequest
3 голосов
/ 22 июня 2010

Я хотел бы извлечь папку 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 ]

7 голосов
/ 22 июня 2010

Вы могли бы сделать что-то вроде этого, я проверил, и это работает для меня:

// 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 голосов
/ 22 июня 2010

Если вы просто хотите извлечь определенные файлы из архива (и вы знаете, что они есть), используйте второй параметр (записи).

 $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 ) для чтения потока, который затем записываете в файл назначения.

...