Запаковать каталог с PHP
у меня есть код, который сжимает файл и каталог. Проблема в том, что он сжимает файлы и каталоги, которые находятся в корневом каталоге, но подкаталоги, они не сжимаются, например У меня есть следующие каталоги:
/ Папка, папка/файл.php, папка/другое/folder2, file1.php
и Он только сжимает папку/ file1.php ...
Он должен сжать файл.php, другой/ folder2/
Код:
<?php
function Show_files($local){
$zip = new ZipArchive();
if($zip->open('compact.zip', ZIPARCHIVE::CREATE) == TRUE){
$open = opendir($local);
while($folder = readdir($open)){
if(is_dir($local.$folder) && $folder != '.' && $folder != '..'){
echo $local.$folder.'<br>';
$zip->addEmptyDir($folder);
Show_files($local.$folder.'/');
}elseif(is_file($local.$folder) && $folder != '.' && $folder != '..'){
$zip->addFile($local.$folder, $folder);
echo $local.$folder.'<br>';
}
}
}
}
$raiz = str_replace("\\", "/", getcwd())."/";
Show_files($raiz);
?>
1 answers
Что происходит в том, что вы находитесь рерайтинг файл, потому что это рекурсивная функция, то экземпляр $zip
создается каждый раз, как она проходит мимо вызова рекурсивной функции. Чтобы дать правильный создайте из экземпляра $zip
и передать в качестве параметра функции.
, Например, с function
:
<?php
function Compact($zip, $cwd) {
$open = opendir($cwd);
while($folder = readdir($open))
{
if ($folder != '.' && $folder != '..'){
if (is_dir($cwd.'/'.$folder))
{
$dir = str_replace('./', '',($cwd.'/'.$folder));
$zip->addEmptyDir($dir);
Compactar($zip, $dir);
}
elseif (is_file($cwd.'/'.$folder))
{
$arq = str_replace('./', '',$cwd.'/'.$folder);
$zip->addFile($arq);
}
}
}
}
$zip = new ZipArchive();
if ($zip->open("arquivoFAfa.zip", ZIPARCHIVE::CREATE) === true){
Compact($zip, ".");
}
$zip->close();
, Например class
распространив ZipArchive
<?php
class Zipper extends ZipArchive
{
public function Compact($cwd) {
$open = opendir($cwd);
while($folder = readdir($open))
{
if ($folder != '.' && $folder != '..')
{
if (is_dir($cwd.'/'.$folder))
{
$dir = str_replace('./', '',($cwd.'/'.$folder));
$this->addEmptyDir($dir);
$this->Compact($dir);
}
elseif (is_file($cwd.'/'.$folder))
{
$arq = str_replace('./', '',$cwd.'/'.$folder);
$this->addFile($arq);
}
}
}
}
}
$zip = new Zipper();
if ($zip->open("arquivoFAClassAbc.zip", ZIPARCHIVE::CREATE) === true){
$zip->Compact(".");
}
$zip->close();
Совет: Используйте второй вариант, потому что не будет этой проблемы экземпляр, несмотря на то, что первая, - это просто создать экземпляр из как сообщалось, в начале ответа.