Класс PHP ZipArchive не создает архив
Я пытаюсь создать архив выбранных файлов, используя следующий код
$zip_in = new \ZipArchive;
if ($zip_in->open('input.zip') === TRUE) {
$files = array();
for ($loop = 0; $loop < $zip_in->numFiles; $loop++) {
$files[] = $zip_in->getNameIndex($loop);
}
$zip_in->extractTo('workspace');
$zip_in->close();
/**
* Changes done to files extracted inside WORKSPACE DIR above
*/
chdir('workspace');
$zip_out = new \ZipArchive();
$zip_out->open('output.zip', \ZipArchive::CREATE);
foreach ($files as $file) {
$zip_out->addFile($file);
}
$zip_out->close();
}
Здесь я пытаюсь извлечь архив input.zip в каталог рабочей области, чтобы внести изменения в файлы, содержащиеся в zip-архиве. После этого я хочу снова сжать все файлы обратно в архив output.zip.
Переменная $files
используется для хранения извлеченных имен файлов, нигде не затрагивается при редактировании файлов. Имена файлов жестко закодированы и не принимаются никакими переменными.
Последняя строка для окончательного сохранения архива output.zip выдает следующее предупреждение на консоли:
Предупреждение PHP: ZipArchive::close(): Ошибка чтения: каталог в /home/user/zip.php в строке 100
Я не могу понять причину этой неудачи. Сообщение об ошибке неясно. В чем причина этого сбоя?
Редактировать:
По запросу добавлен код для вызова обработчика архива, описанного выше.
class A {
public function A1 () {
/**
* the code above
*/
}
}
class B {
public function B1 {
$a = new A();
$a->A1();
}
}
Это часть приложения CakePHP 3. Если принять во внимание комментарии, когда я запускаю код независимо от приложения CakePHP 3, он работает просто отлично. Однако внутри приложения CakePHP есть некоторые проблемы. Я добавляю дополнительные теги, чтобы выделить вопрос в сообществе CakePHP.
1 ответ
Потому что ваш код неверен, и вы заменяете экземпляр ZipArchive файлом:
$ zip = addFile($ file);
заменить:
$ Zip-> AddFile($ файла);