За последние 24 часа нас посетил 23001 программист и 1241 робот. Сейчас ищут 716 программистов ...

Директории и zip в php

Тема в разделе "PHP для новичков", создана пользователем Web, 26 фев 2017.

  1. Web

    Web Новичок

    С нами с:
    21 окт 2016
    Сообщения:
    30
    Симпатии:
    1
    Недавно понадобилось заносить все файлы из папки в zip архив. Нашел на этом форуме функцию для рекурсивного обхода всех директорий:
    PHP:
    1. function scandirs($start, $deep = false) {
    2. static $current_level = 0;
    3. $files = array();
    4. $handle = opendir($start);
    5. while (false !== ($file = readdir($handle))) {
    6.      if ($file != '.' && $file != '..') {
    7.          if (is_dir($start.'/'.$file)) {
    8.              if ($current_level === $deep) {
    9.                  continue;
    10.              }
    11.              $current_level++;
    12.              $dir = scandirs($start.'/'.$file, $deep);
    13.              $files[$file] = $dir;
    14.          } else {
    15.              array_push($files, $file);
    16.          }
    17.      }
    18. }
    19. closedir($handle);
    20. $current_level--;
    21. return $files;
    22. }
    И вот такой код для записи в архив:
    PHP:
    1. $files = scandirs('директорияl', true);
    2. $zip = new ZipArchive();
    3. $filename = "backap ".date("H:i_d.n.Y").".zip";
    4. $zip->open($filename, ZipArchive::CREATE);
    5. for($i=0;$i < count($files);$i++){
    6.     $zip->addFile($files[$i]);
    7. }
    8. $zip->close();
    Но возникла проблема. Файлы в архив он записывает, а директории нет. То есть надо заново каждую директорию обходить ? Может есть более изящный вариант ?
     
  2. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @Web
    Код (Text):
    1. for($i=0;$i < count($files);$i++){
    2. if(is_file($files[$i])){
    3.     $zip->addFile($files[$i]);
    4. }else{
    5. $Zip->addEmptyDir($files[$i]);}
    6. }
    както так

    ну и можно глянуть в сторону phar
     
    Web нравится это.
  3. Web

    Web Новичок

    С нами с:
    21 окт 2016
    Сообщения:
    30
    Симпатии:
    1
    Не работает. Ошибка:
    Код (Text):
    1. Fatal error: Uncaught Error: Call to a member function addEmptyDir() on null
     
  4. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @Web строка 5 замени $Zip на $zip
     
    Web нравится это.
  5. Web

    Web Новичок

    С нами с:
    21 окт 2016
    Сообщения:
    30
    Симпатии:
    1
    Всё равно не заносит директории.
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    У меня такое впечатление, что первая функция в этом виде даёт рекурсивный массив в итоге
     
    Web нравится это.
  7. Web

    Web Новичок

    С нами с:
    21 окт 2016
    Сообщения:
    30
    Симпатии:
    1
    Вот что возвращает функция
    Код (Text):
    1. 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" }
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Ну да, рекурсивный массив. А тебе оно вообще не надо. Хотя писать тебе весь алгоритм у меня сейчас настроения нету, но именно поэтому простой обход этого массива циклом не имеет смысла. Я бы, честно говоря, попытался бы прямо в scan_dirs вставить работу с zip-файлом
    --- Добавлено ---
    Вот это попробуй, вроде делает то, что тебе надо: http://fi2.php.net/manual/ru/ziparchive.addfile.php#93090
     
    Web нравится это.
  9. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @Web используй phar он вроде открывается как архив и не нужно будет долго думать
    PHP:
    1. $phar = new Phar(Выходное имя);
    2. $phar->buildFromDirectory(Директорию в архивв);
     
    #9 abrdabr, 26 фев 2017
    Последнее редактирование модератором: 26 фев 2017
    Web нравится это.
  10. Ivanov_Sania

    Ivanov_Sania Новичок

    С нами с:
    2 дек 2016
    Сообщения:
    14
    Симпатии:
    6
    Или так:

    PHP:
    1. shell_exec("tar -cvf /path/filename.tar.gz /path_copy_dir/* ");
     
    Web нравится это.