Search code examples
phpziparchivedirectory-structurephp-ziparchive

How to achieve the following file structure when archiving a directory in PHP using ZipArchive();


I'm writing a PHP script that archives a selected directory and all its sub-folders. The code works fine, however, I'm running into a small problem with the structure of my archived file.

Imagine the script is located in var/app/current/example/two/ and that it wants to backup everything plus its sub directories starting at var/app/current

When I run the script it creates an archive with the following structure:

/var/app/current/index.html
/var/app/current/assets/test.css
/var/app/current/example/file.php
/var/app/current/example/two/script.php

Now I was wondering how:

a) How can I remove the /var/app/current/ folders so that the root directory of the archive starts beyond the folder current, creating the following structure:

index.html
assets/test.css
example/file.php
example/two/script.php

b) Why & how can I get rid of the "/" before the folder var?

//Create ZIP file
$zip = new ZipArchive();  
$tmpzip = realpath(dirname(__FILE__))."/".substr(md5(TIME_NOW), 0, 10).random_str(54).".zip";

//If ZIP failed
if($zip->open($tmpzip,ZIPARCHIVE::CREATE)!== TRUE)
{
    $status = "0";
}
else
{
    //Fetch all files from directory    
    $basepath = getcwd(); //   var/app/current/example/two
    $basepath = str_replace("/example/two", "", $basepath); //   var/app/current
    $dir = new RecursiveDirectoryIterator($basepath);

    //Loop through each file
    foreach(new RecursiveIteratorIterator($dir) as $files => $file)
    {
        if(($file->getBasename() !== ".") && ($file->getBasename() !== ".."))
        {
            $zip->addFile(realpath($file), $file);  
        }
    }

    $zip->close();

Solution

  • You should try with:

    $zip->addFile(realpath($file), str_replace("/var/app/current/","",$file));