У меня сжатый_файл.zip на сайте с этой структурой:
Я хочу извлечь весь контент из папки version_1.x в корневую папку:
Как я могу это сделать? возможен без рекурсии?
Это возможно, но вы должны сами прочитать и написать файл, используя ZipArchive::getStream
:
$source = 'version_1.x'; $target = '/path/to/target'; $zip = new ZipArchive; $zip->open('myzip.zip'); for($i=0; $i<$zip->numFiles; $i++) { $name = $zip->getNameIndex($i); // Skip files not in $source if (strpos($name, "{$source}/") !== 0) continue; // Determine output filename (removing the $source prefix) $file = $target.'/'.substr($name, strlen($source)+1); // Create the directories if necessary $dir = dirname($file); if (!is_dir($dir)) mkdir($dir, 0777, true); // Read from Zip and write to disk $fpr = $zip->getStream($name); $fpw = fopen($file, 'w'); while ($data = fread($fpr, 1024)) { fwrite($fpw, $data); } fclose($fpr); fclose($fpw); }
Посмотрите на документы для extractTo
. Пример 1.
Я получал аналогичные ошибки @quantme при использовании решения @ netcoder. Я внес изменения в это решение, и он работает без ошибок.
$source = 'version_1.x'; $target = '/path/to/target'; $zip = new ZipArchive; if($zip->open('myzip.zip') === TRUE) { for($i = 0; $i < $zip->numFiles; $i++) { $name = $zip->getNameIndex($i); // Skip files not in $source if (strpos($name, "{$source}/") !== 0) continue; // Determine output filename (removing the $source prefix) $file = $target.'/'.substr($name, strlen($source)+1); // Create the directories if necessary $dir = dirname($file); if (!is_dir($dir)) mkdir($dir, 0777, true); // Read from Zip and write to disk if($dir != $target) { $fpr = $zip->getStream($name); $fpw = fopen($file, 'w'); while ($data = fread($fpr, 1024)) { fwrite($fpw, $data); } fclose($fpr); fclose($fpw); } } $zip->close(); }