ЕЖЕНЕДЕЛЬНАЯ РЕКЛАМНАЯ ГАЗЕТА ДЛЯ ПРЕДПРИЯТИЙ «Деловая неделя» (Иркутск) | |||||||||||||
|
|||||||||||||
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 Добавить комментарий: |