Пример управления файлами
| Автор: | Артемьев Сергей Игоревич |
| 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 будет одинаковым.
Эту функцию можно использовать везде, где надо синхронизировать два каталога или просто скопировать файлы. В коде после пометки "дополнительная обработка" можно вставить любые необходимые операции, например, наложение водяного знака на изображение, регистрация файла в базе данных или удаление.
При небольшой доработке функцию можно адаптировать для копирования каталога со всеми подкаталогами. Но следует помнить, что на большинстве серверов включен безопасный режим, а значит автоматически создать необходимые каталоги скорее всего не удастся и скрипт завешится с ошибкой.
Поэтому при разработке скриптов и сайтов надо стараться избегать решений, требующих частого создания или удаления каталогов на сервере. Это упростит процесс поддержки скрипта а также избавит вас от необходимости постоянно подключаться к серверу и вручную создавать нужные каталоги.