How to compress files and directories in php

Asked

Viewed 2,467 times

3

Hello, I need to compact files and folders together, for example, I have a folder called teste and it has several files and subfolders (with more subfolders inside), and I would like to compress all this with php.

So far I only have this code, but it compacts the whole way and not just where I indicated, for example, if I indicate to it compress teste/teste1/ it won’t compress what’s inside teste1 and yes the whole way from teste.

    $directory = DIR_ARQUIVOS.'yNPA8Bg0GFLV';

$zipfile = DIR_ARQUIVOS.'yNPA8Bg0GFLV.zip';

$filenames = array();

function browse($dir) 
{
    global $filenames;
    if ($handle = opendir($dir)) 
    {
        while (false !== ($file = readdir($handle))) 
        {

            if($file != "." && $file != ".." && is_file($dir.'/'.$file) && $dir != './arquivos/yNPA8Bg0GFLV') 
            {
                echo $dir. "<br/>";
                $filenames[] = $dir.'/'.$file;
            }
            else if ($file != "." && $file != ".." && is_dir($dir.'/'.$file)) 
            {
                browse($dir.'/'.$file);
            }
        }
        closedir($handle);
    }
    return $filenames;
}

browse($directory);

$zip = new ZipArchive();

if ($zip->open($zipfile, ZIPARCHIVE::CREATE)!== TRUE){exit("cannot open <$zipfile>\n");}

foreach ($filenames as $filename) 
{
    echo "Adding " . $filename . "<br/>";
    $zip->addFile($filename,$filename);
}

$zip->close();

1 answer

2


The function below is a little old but works well.

The description of what the script does is in the code comments.

function Compress($source_path)
{
    // Normaliza o caminho do diretório a ser compactado
    $source_path = realpath($source_path);

    // Caminho com nome completo do arquivo compactado
    // Nesse exemplo, será criado no mesmo diretório de onde está executando o script
    $zip_file = __DIR__.'/'.basename($source_path).'.zip';

    // Inicializa o objeto ZipArchive
    $zip = new ZipArchive();
    $zip->open($zip_file, ZipArchive::CREATE | ZipArchive::OVERWRITE);

    // Iterador de diretório recursivo
    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($source_path),
        RecursiveIteratorIterator::LEAVES_ONLY
    );

    foreach ($files as $name => $file) {
        // Pula os diretórios. O motivo é que serão inclusos automaticamente
        if (!$file->isDir()) {
            // Obtém o caminho normalizado da iteração corrente
            $file_path = $file->getRealPath();

            // Obtém o caminho relativo do mesmo.
            $relative_path = substr($file_path, strlen($source_path) + 1);

            // Adiciona-o ao objeto para compressão
            $zip->addFile($file_path, $relative_path);
        }
    }

    // Fecha o objeto. Necessário para gerar o arquivo zip final.
    $zip->close();

    // Retorna o caminho completo do arquivo gerado
    return $zip_file;
}

// O diretório a ser compactado
$source_path = '/folder/folder/';
echo Compress($source_path);

Browser other questions tagged

You are not signed in. Login or sign up in order to post.