Подскажите функцию или класс по копированию файлов и папок

Тема в разделе "PHP", создана пользователем Solomon Kane, 10 фев 2011.

Модераторы: latteo
  1. Solomon Kane

    Solomon Kane Постоялец

    Регистр.:
    26 авг 2009
    Сообщения:
    144
    Симпатии:
    9
    Как известно, php не умеет на лету копировать директории. Поэтому приходится изгаляться и писать свои функции. Глянул через Яндекс и Google, есть парочка примеров, но ХЗ, насколько они рабочие. В общем, нужна функция, которую вы уже неоднократно испробовали в своей работе и она работает, как часы, чтобы могла копировать, как файлы, так и папки. То есть чтобы если это вдруг оказывался файл, а не папка, она не начинала ругаться, а копировала просто файл. Главное требование - функция должна именно копировать файлы и папки, которые не загружены (такие примеры попадались) через форму, а те, что указаны в качестве параметров. Что-то типа ext_copy($start, $end);

    Кто что может посоветовать?
     
  2. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Посоветовал бы вам сесть и написать самостоятельно то что вам необходимо, а не искать готовое решение, тем более не понятно что может быть зашито в это решение.

    ТЗ (какое не какое) у вас уже есть, так что если сами не осилите написание необходимого функционала, можете обратиться за платной помощью к специалисту.

    Лично я реализовал для себя целый набор функций обеденный в класс для работы с файловой системой.

    То что вам необходимо я думаю наврядли у кого то завалялось именно в желаемом вам виде.
     
  3. Solomon Kane

    Solomon Kane Постоялец

    Регистр.:
    26 авг 2009
    Сообщения:
    144
    Симпатии:
    9
    Замутил кое-что своё. Вот оно:

    PHP:
    function ext_copy($start$end$files)
      {
            foreach (
    $files as $value)
            {
                if (
    is_file($start.$value))
                {
                    
    copy($start.$value$end.$value);
                }
                if (
    is_dir($start.$value))
                {
                    
    mkdir($end.$value);
                    
    $dir_map directory_map($start.$valueTRUE);
                    if (!empty(
    $dir_map))
                    {
                        foreach (
    $dir_map as $val)
                        {
                            if(
    is_file($start.$value."/".$val))
                            {
                                
    copy($start.$value."/".$val$end.$value."/".$val);
                            }
                            if (
    is_dir($start.$value."/".$val))
                            {
                                
    mkdir($end.$value."/".$val);
                                
    $arr directory_map($start.$value."/".$val."/"TRUE);
                                
    $this->ext_copy($start.$value."/".$val."/"$end.$value."/".$val."/"$arr);
                            }
                        }
                    }
                }
            }
      }
    Для тех, кто не знает, что такое directory_map(), это функция, которая возвращает в виде массива содержимое папки (это не родная функция php). TRUE - означает, что возвращается только первый уровень, то есть если в папке есть два файла и папка, то только их названия и вернёт. Если же TRUE убрать, то вернёт и то, что находится в папке, помимо двух файлов.

    В целом алгоритм такой - в функцию попадает три параметра - начальная и конечная папка, а также массив с файлами, которые надо копировать. Далее идёт проверка, если файл - файл, то просто копируется, если папка - то получаются всё файлы этой папки, а потом методом перебора через массив проверяется, что там внутри. В случае нахождения папки запускается рекурсия.

    Просьба к разбирающимся людям глянуть на скрипт и посоветовать, что дописать или изменить. Может, проверки какие-то или как-то сократить можно.