Деловая неделя

Как копировать папки на PHP с управляющими настройками вида «перезаписать» – «пропустить»? Предлагаю скрипт, работающий по типу xcopy /d - перезаписывающий файлы с более ранними датами (или не перезаписывающий, если не указать параметр).

ЕЖЕНЕДЕЛЬНАЯ РЕКЛАМНАЯ ГАЗЕТА ДЛЯ ПРЕДПРИЯТИЙ «Деловая неделя» (Иркутск)

PHP копирование папки (copy folder)

Для работы веб-приложения (небольшой файл-менеджер для дизайнера) понадобилось организовать копирование файлов и целых папок. И начали всплывать вякие неприятные вещи по работе со средой и окнами. Дизайнер ведь пока что работает под Windows. Да. А потом-то ведь он переедет на Линукс (зачем вообще нужны веб-приложения, кроме как для кроссплатформенности?). И, допустим, прикрутим мы как-то через задницу и заставим работать все эти copy-xcopy, а потом ведь на cp придётся переделывать, и наверняка другие проблемы всплывут.

Всё, в общем, складывается за то, чтобы с помощью самого PHP копировать файлы и папки. С файлами там вроде всё понятно, а вот для папок специальной функции нет. Она, казалось бы, довольно очевидно как должна выглядеть: открываешь папку, просматриваешь файлы в цикле и копируешь. Если файл – папка, передаёшь его в качестве параметра этой же фукнции (рекурсия). Но всё равно всегда интересно, что там, в Сети уже готового есть на эту тему (да и с подводными камнями ознакомиться не лишне).

По фразе php copy folder вылезли удручающе однообразные буржуйские сайты (воруют – все!) с копирующим одну и ту же избыточность алгоритмом:

Зачем два раза проверять, является ли файл папкой? Функцию можно сократить и сделать более логичной:

Вызывает некоторое раздражение и подавляющая «собака» перед mkdir – а что будет, если операция по созданию новой папки "тихо" закончится неудачей (например, если существует файл с таким именем)? Но это всё мелочи. Главный вопрос, конечно, – нафига копировать папки без управляющих настроек типа «перезаписать» – «пропустить»? На самом деле, конечно, при сотнях (или даже десятках) файлов, предполагаемых в нашем приложении, руками на такие вопросы отвечать не будешь. Да и придумано давно уже, как поступать в этом случае – файлы просто сравниваются по датам, и файлы с более новыми датами перезаписывают более старые. Такой механизм под Windows обычно используют с помощью программы xcopy. Вот мы и решили назвать наш кроссплатформенный скрипт копирования папок xcopy.php. Получилось вот что:

Пришлось добавить три новых функции:

mkdir_safe() – проверяет, существует ли файл с именем создаваемой папки, и если существует и является папкой, не пытается создать папку заново (а если НЕ является папкой, убивает или прощает в зависимости от параметра $force);

copy_safe() (перезаписывающего существующие файлы при определённых условиях);

fs_log() – чтобы записывать каждую неудачу или успех (ну, не каждую, а только те, которые нужны, чтобы понять, где произошёл сбой).

Функция copy_safe() ещё подправляет время изменения скопированных файлов (необходимо для работы под Windows). Ну, и время на компьютере вообще штука тонкая, и иногда вытворят всякие фокусы; поэтому лучше перед работой скрипта устанавливать date_default_timezone_set('Asia/Irkutsk'); (это у меня 'Asia/Irkutsk', а вы ставьте то, что вам надо).

Вот сам скрипт (код), а вот скрипт в архиве.

D.M., admin

Читать все комментарии (0)

Добавить комментарий:

*Автор:
E-Mail:
*Текст: