PHP zip results in flat folder structure -
i using php zip function created former employee. compresses files , folders i'm having 2 problems resulting zip file:
a. doesn't include 'main' folder
b. doesn't keep parent/child folder structure
what want have child folders under parent folders, so:
parent1 +-- child1a +-- child1b parent2 parent3 +-- child3a +-- subchild3a1 +-- subchild3a2
but i'm ending flat folder structure in zip file:
parent1 child1a child1b parent2 parent3 child3a subchild3a1 subchild3a2
how resolve issue using following code:
<?php function foldertozip($folder, &$zipfile, $subfolder = null) { if ($zipfile == null) { return false; } $folder .= end(str_split($folder)) == "/" ? "" : "/"; $subfolder .= end(str_split($subfolder)) == "/" ? "" : "/"; $handle = opendir($folder); while ($f = readdir($handle)) { if ($f != "." && $f != ".." && $f != "archive") { if (is_file($folder . $f)) { if ($subfolder != null) $zipfile->addfile($folder . $f, $subfolder . $f); else $zipfile->addfile($folder . $f); } elseif (is_dir($folder . $f)) { $zipfile->addemptydir($f); foldertozip($folder . $f, $zipfile, $f); } } } } ?> <?php $z = new ziparchive(); $z->open("test.zip", ziparchive::create); foldertozip("c:/path/to/look/for/files/to/compress/", $z); echo "<br />done"; $z->close(); $ex_file = "./archive/back-" . date('ymd_hi', time()) . ".zip"; rename("test.zip", $ex_file); ?>
edit: here's script worked me:
<?php function foldertozip($folder, $zipfile, $subfolder = null) { if ($zipfile == null) { return false; } $folder .= end(str_split($folder)) == "/" ? "" : "/"; $subfolder .= end(str_split($subfolder)) == "/" || $subfolder == null ? "" : "/"; $handle = opendir($folder); while ($f = readdir($handle)) { if ($f != "." && $f != ".." && $f != "archive") { if (is_file($folder . $f)) { $zipfile->addfile($folder . $f, $subfolder . $f); } elseif (is_dir($folder . $f)) { $zipfile->addemptydir($subfolder . $f); foldertozip($folder . $f, $zipfile, $subfolder . $f); } } } } ?> <?php $z = new ziparchive(); $z->open("test.zip", ziparchive::create); foldertozip("c:/path/to/look/for/files/to/compress/", $z); echo "<br />done"; $z->close(); $ex_file = "./archive/back-" . date('ymd_hi', time()) . ".zip"; rename("test.zip", $ex_file); ?>
this code appears incorrect:
} elseif (is_dir($folder . $f)) { $zipfile->addemptydir($f); foldertozip($folder . $f, $zipfile, $f); }
i believe should be:
} elseif (is_dir($folder . $f)) { $zipfile->addemptydir($subfolder . $f); foldertozip($folder . $f, $zipfile, $subfolder . $f); }
without referencing $subfolder , passing recursive function, referencing '/' or root of zip file.
Comments
Post a Comment