Недавно понадобилось заносить все файлы из папки в zip архив. Нашел на этом форуме функцию для рекурсивного обхода всех директорий: PHP: function scandirs($start, $deep = false) { static $current_level = 0; $files = array(); $handle = opendir($start); while (false !== ($file = readdir($handle))) { if ($file != '.' && $file != '..') { if (is_dir($start.'/'.$file)) { if ($current_level === $deep) { continue; } $current_level++; $dir = scandirs($start.'/'.$file, $deep); $files[$file] = $dir; } else { array_push($files, $file); } } } closedir($handle); $current_level--; return $files; } И вот такой код для записи в архив: PHP: $files = scandirs('директорияl', true); $zip = new ZipArchive(); $filename = "backap ".date("H:i_d.n.Y").".zip"; $zip->open($filename, ZipArchive::CREATE); for($i=0;$i < count($files);$i++){ $zip->addFile($files[$i]); } $zip->close(); Но возникла проблема. Файлы в архив он записывает, а директории нет. То есть надо заново каждую директорию обходить ? Может есть более изящный вариант ?
@Web Код (Text): for($i=0;$i < count($files);$i++){ if(is_file($files[$i])){ $zip->addFile($files[$i]); }else{ $Zip->addEmptyDir($files[$i]);} } както так ну и можно глянуть в сторону phar
Не работает. Ошибка: Код (Text): Fatal error: Uncaught Error: Call to a member function addEmptyDir() on null
Вот что возвращает функция Код (Text): array(12) { ["m"]=> array(4) { ["css"]=> array(3) { [0]=> string(11) "m.index.css" [1]=> string(7) "reg.css" [2]=> string(8) "task.css" } [0]=> string(8) "task.php" [1]=> string(7) "reg.php" [2]=> string(9) "index.php" } ["img"]=> array(4) { ["bg"]=> array(6) { [0]=> string(8) "bg-7.jpg" [1]=> string(8) "bg-5.jpg" [2]=> string(8) "bg-1.jpg" [3]=> string(8) "bg-9.jpg" [4]=> string(8) "bg-4.jpg" [5]=> string(8) "bg-3.jpg" } [0]=> string(9) "bg-10.jpg" [1]=> string(8) "bg-5.jpg" [2]=> string(14) "background.jpg" } ["php"]=> array(5) { [0]=> string(8) "mail.php" [1]=> string(6) "db.php" [2]=> string(16) "registration.php" [3]=> string(9) "login.php" [4]=> string(12) "function.php" } ["css"]=> array(3) { [0]=> string(8) "main.css" [1]=> string(7) "reg.css" [2]=> string(8) "task.css" } ["ico"]=> array(5) { [0]=> string(8) "comp.png" [1]=> string(9) "phone.png" [2]=> string(11) "favicon.png" ["browsers"]=> array(5) { [0]=> string(11) "firefox.png" [1]=> string(10) "yandex.png" [2]=> string(10) "chrome.png" [3]=> string(9) "opera.png" [4]=> string(9) "Thumbs.db" } [3]=> string(9) "error.png" } [0]=> string(8) "task.php" ["js"]=> array(4) { [0]=> string(14) "site_design.js" [1]=> string(11) "ajax_reg.js" [2]=> string(9) "cookie.js" ["libs"]=> array(2) { [0]=> string(17) "prefixfree.min.js" [1]=> string(19) "jquery-3.1.1.min.js" } } ["error"]=> array(3) { [0]=> string(12) "browser.html" [1]=> string(13) "js_error.html" [2]=> string(17) "screen_error.html" } [1]=> string(7) "reg.php" [2]=> string(9) "index.php" [3]=> string(10) "backap.php" [4]=> string(9) ".htaccess" }
Ну да, рекурсивный массив. А тебе оно вообще не надо. Хотя писать тебе весь алгоритм у меня сейчас настроения нету, но именно поэтому простой обход этого массива циклом не имеет смысла. Я бы, честно говоря, попытался бы прямо в scan_dirs вставить работу с zip-файлом --- Добавлено --- Вот это попробуй, вроде делает то, что тебе надо: http://fi2.php.net/manual/ru/ziparchive.addfile.php#93090
@Web используй phar он вроде открывается как архив и не нужно будет долго думать PHP: $phar = new Phar(Выходное имя); $phar->buildFromDirectory(Директорию в архивв);