Скрипт по распаковкe zip
Использую этот скрипт
$zip = new ZipArchive;
$res = $zip->open('file.zip');
if ($res === TRUE) {
$zip->extractTo('/myzips/extract_path/');
$zip->close();
echo 'woot!';
} else { echo 'doh!'; }
Он распаковывает один архив, нужно чтобы он распаковывал все архивы в папке, подпапках. И ещё нужно, чтобы зип после распаковки удалялся.
Может кто-то уже сталкивался с этим? Подскажите как доделать.
Ответы (1 шт):
Автор решения: NaClnik
→ Ссылка
я написал для Вас скрипт, который рекурсивно распаковывает архив zip. Я постарался максимально задокументировать свой код комментариями, чтобы Вам было максимально понятно. Буду рад, если этот код кому-нибудь пригодится!)
<?php
// Вызов функции, которая распаковывает zip архив.
unpackZipArchive(__DIR__.'\\assets\\src\\sasa.zip', __DIR__.'\\assets\\updated\\');
// В качестве параметров передаём:
// path: Путь к zip-архиву
// unpackToPath: Путь к директории, в которую нужно распаковать архив.
function unpackZipArchive(string $path, string $unpackToPath){
// Создаём новый экземпляр архива.
$zip = new ZipArchive();
// Открываем архив.
$zip->open($path);
// Получаем нахвание архива из пути без расширения .zip.
$filename = getFileNameWithoutExtension($path);
// Получаем путь к распаковываемой директории с именем архива.
$unpackToPath = $unpackToPath.$filename;
// Распаковываем архив.
$zip->extractTo($unpackToPath);
// Закрываем архив, чтобы можно было его удалить.
$zip->close();
// Удаляем архив.
unlink($path);
// Если в распакованной директории больше нет архивов, то выходим из рекурсивного метода.
if(isNoZipArchivesInDirectory($unpackToPath)){
return;
} // if.
// Получаем все архивы, которые находятся в директории и ходим по ним.
foreach (getZipPaths($unpackToPath) as $path){
$temp = $unpackToPath.'\\'.getFileNameWithoutExtension($path);
// Рекурсивный вызов.
unpackZipArchive($temp.'.zip', $unpackToPath.'\\');
} // foreach.
} // unpackZipArchive.
// Функция, которая возвращает массив с названиями всех архивов.
function getZipPaths(string $path){
$dir = opendir($path);
$list = [];
while (($file = readdir($dir)) != false) {
if(getFileExtension($file) == 'zip'){
array_push($list, $file);
}
}
closedir($dir);
return $list;
} // getZipPaths.
// Получение названия файла без расширения по пути.
function getFileNameWithoutExtension(string $path){
$segments = explode('\\', $path);
$filenameWithExtension = end($segments);
return explode('.', $filenameWithExtension)[0];
} // getFileName.
// Функция, которая возвращает значение: есть ли в указанной директории архивы.
function isNoZipArchivesInDirectory(string $path): bool{
$dir = opendir($path);
$flag = true;
while (($file = readdir($dir)) != false) {
if(getFileExtension($file) == 'zip'){
$flag = false;
break;
}
}
closedir($dir);
return $flag;
} // noZipArchivesInDirectory.
// Полуение расширения из имени файла.
function getFileExtension(string $filename){
$fileNameSegments = explode('.', $filename);
return end($fileNameSegments);
} // getFileExtension.