Пример управления файлами
Автор: | Артемьев Сергей Игоревич |
ICQ: | 438856621 |
email: | _spin_@bk.ru |
В практике веб-программиста периодически возникают задачи копирования и простой синхронизации каталогов сервера. В этом примере мы создадим довольно универсальную функцию копирования данных.
<?php /* $srcdir - каталог с исходными файлами $dstdir - конечный каталог $forced - принудительная синхронизация (перезапись файлов в конечном каталоге) */ setlocale(LC_ALL, 'ru-RU'); function sync_folder($srcdir, $dstdir, $forced = false) { $sizetotal = 0; if(!is_dir($dstdir)) mkdir($dstdir); // открываем исходный каталог if($curdir = opendir($srcdir)) { // последовательно считываем все // имена файлов и каталогов while($file = readdir($curdir)) { // пропускаем указатель на текущий и // предыдущий каталоги if($file != '.' && $file != '..') { $srcfile = $srcdir . '/' . $file; $dstfile = $dstdir . '/' . $file; // если текущий элемент - файл if(is_file($srcfile)) { // если конечный файл существует - // проверяем, надо ли его обновлять if(is_file($dstfile)) $ow = filemtime($srcfile) - filemtime($dstfile); else $ow = 1; // если надо обновлять if($ow > 0 || $forced) { echo "Копирую '$srcfile' в '$dstfile'..."; // пробуем скопироваь файл if(copy($srcfile, $dstfile)) { // дополнительная обработка // ... // устанавливаем время создания конечного // файла такое же, как у исходного. touch($dstfile, filemtime($srcfile)); $num++; // устанавливаем права на доступ к // файлу "можно всё всем" chmod($dstfile, 0777); // увеличиваем счётчик скопированного // объема на объём последнего файла $sizetotal = ($sizetotal + filesize($dstfile)); echo "Готово \n <br />"; } else { echo "Ошибка: Не могу ". "скопировать файл '$srcfile'! <br />\n"; } } } } } // закрываем ранее открытый каталог closedir($curdir); } echo 'Копирование завершено!'; return true; } sync_folder('./src', './dest', isset($_REQUEST['forced'])); ?>
Сохраните текст примера в файле syncfolder.php в одном из каталогов веб-сервера, а так же создайте рядом со скриптом два каталога: src и dest. В первый каталог поместите несколько произвольных файлов и в браузере запустите скрипт на выполнение.
По окончании копирования в браузере отобразится список скопированных файлов и сообщение "Копирование завершено!", а содержимое каталогов src и dest будет одинаковым.
Эту функцию можно использовать везде, где надо синхронизировать два каталога или просто скопировать файлы. В коде после пометки "дополнительная обработка" можно вставить любые необходимые операции, например, наложение водяного знака на изображение, регистрация файла в базе данных или удаление.
При небольшой доработке функцию можно адаптировать для копирования каталога со всеми подкаталогами. Но следует помнить, что на большинстве серверов включен безопасный режим, а значит автоматически создать необходимые каталоги скорее всего не удастся и скрипт завешится с ошибкой.
Поэтому при разработке скриптов и сайтов надо стараться избегать решений, требующих частого создания или удаления каталогов на сервере. Это упростит процесс поддержки скрипта а также избавит вас от необходимости постоянно подключаться к серверу и вручную создавать нужные каталоги.