HTML, Excel, Word, SEOPHP курс для чайников ⇒ Пример управления файлами

PHP для "чайников"

Инструменты
Выбираем IDE
Выбираем Web-сервер
Выбираем СУБД
Структура языка PHP
Первый шаг
Синтаксис
Типы данных
Переменные и константы
Операторы
Выражения
Управляющие структуры
Функции
Классы
Исключения
Ошибки
Массивы
Глобальные массивы
Cookies
Сессии
Загрузка файлов
Работа с файлами
Работа с файлами на диске
Работа с данными в файле
Пример управления файлами
Работа с базами данных
Подключение
Анализ результатов
Выполнение запросов
Отключение
Пример: отслеживание пользователей
Работа в сети
Отправка почты
Безопасность
HTTP-аутентификация
Защита логином и паролем
Автоматизация
Регулярные выражения в PHP
Интеграция
PHP и JavaScript



Пример управления файлами


Автор: Артемьев Сергей Игоревич
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 будет одинаковым.

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

При небольшой доработке функцию можно адаптировать для копирования каталога со всеми подкаталогами. Но следует помнить, что на большинстве серверов включен безопасный режим, а значит автоматически создать необходимые каталоги скорее всего не удастся и скрипт завешится с ошибкой.

Поэтому при разработке скриптов и сайтов надо стараться избегать решений, требующих частого создания или удаления каталогов на сервере. Это упростит процесс поддержки скрипта а также избавит вас от необходимости постоянно подключаться к серверу и вручную создавать нужные каталоги.



В начало страницы



В начало страницы