Москва, Строительный проезд, 7А кор. 4 Работаем: 24/7 +7 495 744 67 74

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

Под управлением файлами и каталогами в 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";
    }
?>

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


адрес

г. Москва, Строительный пр., 7Ак4

телефон

+7 495 744 67 74Круглосуточно
Яндекс.Метрика

Если у Вас есть вопросы, жалобы или предложения по работе нашей компании, напишите нам Нам важно любое мнение. Спасибо.