Запаковать каталог с 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);

?>
Author: Maniero, 2014-07-10

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();

Совет: Используйте второй вариант, потому что не будет этой проблемы экземпляр, несмотря на то, что первая, - это просто создать экземпляр из как сообщалось, в начале ответа.

 6
Author: novic, 2017-08-31 22:01:01