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

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

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

 

Управление файлами и каталогами


Автор: Артемьев Сергей Игоревич
ICQ: 438856621
email: _spin_@bk.ru

Под управлением файлами и каталогами в PHP подразумеваются такие операции как:

Копирование файлов производится с помощью функции copy(). Функция имеет всего 2 параметра - имя исходного файла и имя конечного файла. Функция возвращает TRUE, если копирование прошло успешно, и FALSE если произошла ошибка. Если конечный файл уже существует - он будет перезаписан и функция вернёт TRUE. При использовании copy() на Windows-платформе есть особенность: если скопировать файл нулевого размера, то файл успешно скопируется, но copy() вернёт FALSE.

Пример копирования файла:

<?php

    $source = 'readme.txt';
    $dest = 'readme_copy.txt';

    if(!copy($source, $dest)) {
        echo "Ошибка копирования файла $source...<br />\n";
    }
?>

Обратите внимание на конструкцию "<br />\n" в конце строки с ошибкой. Этот простой приём позволяет получать читаемый вид выводимого текста независимо от того куда текст выводится - в консоль отладчика или в браузер. Очень удобно на этапе отладки скрипта.

Более сложный процесс - перемещение файла. Для выполнения перемещения служит функция rename(). Как и предыдущая функция, rename() принимает всего 2 агрумента - старое и новое имя файла. Если пути старого и нового файлов одинаковые - файл просто переименуется, а если разные - будет перемещен но повому пути и переименован.

Пример переменования и перемещения файла:

<?php

    $number = 123;

    $source = 'readme.txt';
    $dest = "./backups/readme_$number.txt";

    if(!rename($source, $dest)) {
        echo "Ошибка перемещения файла $source...<br />\n";
    }
?>

В этом примере исходный файл readme.txt перемещается в подкаталог backups и переименовывается в readme_123.txt.

Удалить существующий файл можно с помощью функции unlink(). Файловая система Unix позволяет создавать жесткие ссылки на существуюие файлы. Ссылка похожа на ярлыки Windows, но в Unix нельзя удалить исходный файл, пока на него есть жесткие ссылки. Функция unlink() удаляет вашу ссылку на файл, а если ссылок больше нет - удаляет его.

<?php

    $file = "./backups/readme_123.txt";

    if(!unlink($file)) {
        echo "Ошибка удаления файла $file...<br />\n";
    }
?>

Для удаления каталогов служит другая функция - rmdir(). Она принимает единственный параметр - имя каталога, который нужно удалить. Удаляемый каталог должен быть пуст, иначе операция завершится с ошибкой. Если каталог успешно удалён - функция вернёт TRUE, в противном случае - FALSE.

<?php

    $directory = "./backups";

    if(!rmdir($directory)) {
        echo "Ошибка удаления каталога $directory...<br />\n";
    }
?>

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

Для создания каталога в PHP применяется функция mkdir(). Функция получает 1 параметр - имя создаваемого каталога. Если каталог успешно создан - функция вернёт TRUE, а при ошибке - FALSE.

<?php

    $directory = "./backups";

    if(!mkdir($directory)) {
        echo "Ошибка создания каталога $directory...<br />\n";
    }
?>

Дополнительные функции

В PHP есть ряд функций, существенно помогающих в работе. Список функций с кратким описанием приведён в таблице.

Функция Описание
string basename ( $path [, $ext] ) Извлекает из полного пути $path только имя файла. Если указано расширение $ext - оно обрезается.
<?php
    $full_path = "/full/path/to/myfile.txt";
    echo basename($full_path);
    // выводит "myfile.txt"
    echo basename($full_path, '.ext');
    // выводит "myfile"
?>
string dirname ( $path ) Извлекает из полного пути $path только путь к файлу (без имени и расширения)
<?php
    $full_path = "/full/path/to/myfile.txt";
    echo dirname($full_path);
    // выводит "/full/path/to"
?>
bool file_exists ( $filename ) Проверяет, существует ли файл или каталог $filename. Функция возвращает TRUE, когда файл или каталог существует и доступен.
<?php
    $filename = "/full/path/to/myfile.txt";
    if(file_exists($filename))
        echo 'Файл существует';
    else
        echo 'Файл не существует';
?>
int fileatime ( $filename ) Возвращает дату и время последнего обращения к файлу
int filectime ( $filename ) Возвращает дату и время последнего изменения файла
int filesize ( $filename ) Возвращает размер файла в байтах
string filetype ( $filename ) Возвращает тип файла. Может возвращать сделующие значения: fifo, char, dir, block, link, file, unknown.
bool is_dir ( $filename ) Проверяет, является ли $filename каталогом
bool is_file ( $filename ) Проверяет, является ли $filename файлом
bool is_uploaded_file ( $filename ) Проверяет, является ли $filename файлом, загруженным на сервер через веб-форму.
 
<?php
    $filename = "/full/path/to/myfile.txt";

if (file_exists($filename)) {
    echo "Последнее обращение: " .
            date("F d Y H:i:s.", fileatime($filename));
    echo "Последнее изменение: " .
            date("F d Y H:i:s.", filectime($filename));
    echo 'Размер: ' . filesize($filename) . ' байт';
    echo 'Тип объекта: ' . filetype($filename);

}
?>
mixed pathinfo ( $path [, $options] ) Возвращает строку или массив строк, содержащий части пути $path (имя каталога, имя файла, расширение)
<?php
    $filename = "/full/path/to/myfile.txt";
    $parts = pathinfo($filename);

    echo $parts['dirname'], "\n";
    echo $parts['basename'], "\n";
    echo $parts['extension'], "\n";
    echo $parts['filename'], "\n";

    // получим на выходе
    //  /full/path/to
    //  myfile.txt
    //  txt
    //  myfile
?>
string realpath ( $path ) Преобразует относительный путь к файлу в реальный полный путь на сервере. Все символические ссылки так же преобразуются в реальные имена каталогов и файлов.
<?php
    echo realpath('.') . "./myfile.txt";
    // получим
    // /full/path/to/myfile.txt
?>
string tempnam ( $dir, $prefix ) Создаёт в каталоге $dir временный файл со случайным именем, начинающимся с $prefix. Если параметры не заданы - будет создан временный файл в глобальном временном каталоге с полностью случайным именем. Созданный файл сохраняется после завершения работы скрипта и закрытия файла.
<?php
    $temp_name = tempnam ($dir, $prefix);
    echo $temp_name;
    unlink($temp_name);
?>
resource tmpfile ( void ) Создаёт в системном временном каталоге временный файл со случайным именем. Созданный файл удаляется немедленно после закрытия.
<?php
    $temp_file = tmpfile();
    fwrite($temp, "=пишем в файл...=");
    fseek($temp, 0);
    echo fread($temp, 1024);
    // выводится
    // =пишем в файл...=
    fclose($temp); // закрываем и удаляем файл
?>
Функции работы с данными внутри файла мы рассмотрим в следующем уроке.

В таблице приведены не все функции, используемые при работе с файлами. Полный список вы сможете найти в документации на официальном сайте.

Поиск файлов и каталогов

Для поиска файлов в каталогах сервера используется несколько функций: glob(), fnmatch() и функции работы с каталогами (opendir(), readdir(), rewinddir(), closedir()).

Функция opendir() открывает указанный каталог и устанавливает внутренний указатель на первый файл. Функция возвращает так называемый "handle" (читается "хэндл") или "указатель". Этот указатель передаётся всем последующим функциям при работе с данным каталогом.

Функция readdir() возвращает имя текущего файла в каталоге и перемещает внутренний указатель на следующий файл. Если последний файл уже был прочитан - функция вернёт FALSE. Функция rewinddir() сбрасывает внутренний указатель на первый файл в каталоге. Функция closedir() закрывает ранее открытый каталог и освобождает всеи используемые ресурсы.

Функция fnmatch($pattern, $filename) проверяет, соответствует ли имя файла $filename маске $pattern.

Пример поиска файла по шаблону:

<?php
    $dir = "./backups/";
    // проверяем, что $dir - каталог
    if (is_dir($dir)) {
        // открываем каталог
        if ($dh = opendir($dir)) {
            // читаем и выводим все элементы
            // от первого до последнего
            while (($file = readdir($dh)) !== false) {
                if(fnmatch('myfile_*.txt', $file))
                    echo 'Резервная копия: ';

                echo "$file : " .
                     filetype($dir . $file) . "<br />\n";

            }
            // закрываем каталог
            closedir($dh);
        }
    }
?>

Функция glob( $pattern ) возвращает массив файлов и каталогов, соответствующих маске $pattern. Если произошла ошибка или ничего не найдено - функция вернёт FALSE.

Пример:

<?php
    foreach (glob("./backups/*.txt") as $filename) {
        echo "$filename : " . filesize($filename) . " байт\n";
    }
?>

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



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



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