Работа с файлами и папками на PHP: от основ до сложных решений

Раздел: Веб-разработка на PHP -> Работа с файловой системой

Основные операции с файлами и каталогами в PHP

Как прочитать содержимое файла?

Эффективный способ для больших файлов

Для чтения файла произвольного размера применяется комбинация fopen(), fread() и fclose(). Открытие осуществляется с указанием режима 'r' (только чтение).


<?php
$file = fopen('data.txt', 'r');
if ($file) {
    $content = fread($file, filesize('data.txt'));
    fclose($file);
    echo $content;
} else {
    echo 'Не удалось открыть файл';
}
?>
  

Php get extension (получение информации о файлах в php)

Перед чтением стоит проверить существование файла с помощью file_exists(), чтобы избежать ошибок.

Простой способ для небольших файлов

file_get_contents() читает весь файл в строку. Подходит для конфигурационных файлов размером до нескольких мегабайт.


<?php
$content = file_get_contents('config.php');
if ($content !== false) {
    echo $content;
} else {
    echo 'Ошибка чтения файла';
}
?>
  

Index php file 1 (работа с файлами и папками на php)

Типичные проблемы

  • При большом файле file_get_contents() может превысить лимит памяти memory_limit.
  • Функция возвращает false при ошибке, но причина (недостаточно прав, файл не найден) остаётся неясной. Рекомендуется дополнительно проверять file_exists().
  • Если файл открыт другим процессом, возможно блокирование. Для решения применяют flock() с fopen().

Как проверить существование файла или директории?

Базовый приём - использование file_exists() в паре с is_file() или is_dir().


<?php
$path = 'uploads/photo.jpg';
if (file_exists($path)) {
    if (is_file($path)) {
        echo 'Это файл';
    } elseif (is_dir($path)) {
        echo 'Это папка';
    }
} else {
    echo 'Путь не существует';
}
?>
  

Php запись в файл (запись в файл php)

Учёт кэширования результатов stat

PHP кэширует результаты вызовов stat(). Если в течение одного запроса файл был создан или удалён, кэш может выдать устаревшие данные. Для сброса используется clearstatcache().


<?php
file_exists('temp.txt'); // первый вызов кэшируется
unlink('temp.txt');      // удаляем файл
clearstatcache();        // очищаем кэш
if (!file_exists('temp.txt')) {
    echo 'Файл действительно удалён';
}
?>
  

Php изменить файл (изменение файла в php)

Ошибки с символическими ссылками

file_exists() проверяет цель ссылки, а не саму ссылку. Если ссылка указывает на несуществующий файл, file_exists() вернёт false даже если сама ссылка существует. Для проверки ссылки используйте is_link().

Как создать и удалить папку?

Создание одиночной папки выполняется функцией mkdir(). Удаление пустой - rmdir().


<?php
$dir = 'new_folder';
if (!is_dir($dir)) {
    mkdir($dir, 0777, true); // рекурсивное создание
    echo 'Папка создана';
}

// удаление
if (is_dir($dir)) {
    rmdir($dir);
    echo 'Папка удалена';
}
?>
  

Php несколько файлов (несколько файлов в php)

Рекурсивное удаление непустой папки

Встроенной функции для удаления дерева папок нет. Используется ручной обход с помощью RecursiveDirectoryIterator или glob().


<?php
function removeDirectory($dir) {
    if (!is_dir($dir)) return false;
    $items = scandir($dir);
    foreach ($items as $item) {
        if ($item == '.' || $item == '..') continue;
        $path = $dir . DIRECTORY_SEPARATOR . $item;
        if (is_dir($path)) {
            removeDirectory($path);
        } else {
            unlink($path);
        }
    }
    rmdir($dir);
    return true;
}

$dir = 'old_project';
removeDirectory($dir);
echo 'Папка удалена';
?>
  

найти файл php (поиск файла php)

Проблемы прав доступа

При создании папки через mkdir() без указания recursive = true родительские папки должны уже существовать. Ошибка возникает, если веб-сервер не имеет прав на запись в целевую директорию. Решение - проверять is_writable() перед операцией.

Как получить список файлов в указанной папке?

Наиболее универсальный способ - scandir(), возвращающий массив имён всех элементов, включая '.' и '..'.


<?php
$files = scandir('/var/www/uploads');
foreach ($files as $file) {
    if ($file != '.' && $file != '..') {
        echo $file . PHP_EOL;
    }
}
?>
  

проверка файлов php (проверка файлов php)

Использование glob() для фильтрации

glob() позволяет отобрать файлы по шаблону, например, только изображения.


<?php
$images = glob('/var/www/uploads/*.{jpg,jpeg,png,gif}', GLOB_BRACE);
foreach ($images as $img) {
    echo basename($img) . PHP_EOL;
}
?>
  

Php папка файла (папка файла php)

Итераторы SPL

DirectoryIterator предоставляет объектно-ориентированный интерфейс для обхода директории.


<?php
$dir = new DirectoryIterator('/var/www/uploads');
foreach ($dir as $fileinfo) {
    if (!$fileinfo->isDot()) {
        echo $fileinfo->getFilename() . PHP_EOL;
    }
}
?>
  

Php размер файла (размер файла php)

Сортировка и кодировка

scandir() возвращает результат в порядке системного вызова, что может отличаться от ожидаемого. Для сортировки используйте sort() или опцию SCANDIR_SORT_ASCENDING. Имена файлов с не-ASCII символами могут отображаться некорректно, если кодировка не установлена в setlocale().

Как удалить отдельный файл?

Функция unlink() удаляет файл по указанному пути.


<?php
$file = 'temp.txt';
if (file_exists($file)) {
    unlink($file);
    echo 'Файл удалён';
} else {
    echo 'Файл не найден';
}
?>
  

Php создание файла (создание файла в php)

Удаление с обработкой ошибок

Для более детального контроля ошибок используется блок try-catch с исключениями.


<?php
$file = 'protected/config.php';
if (@unlink($file) === false) {
    $error = error_get_last();
    echo 'Ошибка удаления: ' . $error['message'];
} else {
    echo 'Файл успешно удалён';
}
?>
  

Файл используется системой или другим процессом

В Windows файл может быть заблокирован другим приложением. В этом случае unlink() вернёт false. Решение - дождаться освобождения файла или использовать is_writable() для предварительной проверки. На Linux подобные блокировки встречаются реже, но возможны при монтировании сетевых файловых систем.

- Php удалить файл (удаление файла в php)
- Php file (работа с файлами в php)
- Php база в файле (хранение данных в файлах в php (flat-file database))

Расширенные примеры работы с файловой системой

Рекурсивное создание вложенных папок

Когда требуется создать структуру каталогов вида uploads/2025/04/photos, удобно использовать третий параметр mkdir() - recursive = true. Это позволяет создать все недостающие промежуточные папки.

Пример

<?php
$path = 'uploads/2025/04/photos';
if (!is_dir($path)) {
    mkdir($path, 0755, true);
    echo 'Папки созданы: ' . $path;
} else {
    echo 'Папка уже существует';
}
?>
Папки созданы: uploads/2025/04/photos

Обратите внимание: права доступа 0755 применяются только к последней создаваемой папке. Промежуточным назначаются стандартные права, заданные умолчанием системы.

Обход директории с фильтрацией по расширению с помощью DirectoryIterator

Класс DirectoryIterator позволяет удобно перебирать содержимое папки. Создадим итератор и выведем только файлы с расширением .php.

Пример

<?php
$dir = new DirectoryIterator('/var/www/html');
$phpFiles = [];
foreach ($dir as $fileinfo) {
    if ($fileinfo->isFile() && $fileinfo->getExtension() === 'php') {
        $phpFiles[] = $fileinfo->getFilename();
    }
}
sort($phpFiles);
echo implode(', ', $phpFiles);
?>
config.php, index.php, functions.php

Метод getExtension() доступен с PHP 5.3.6. Если нужна поддержка старых версий, используйте pathinfo($fileinfo->getFilename(), PATHINFO_EXTENSION).

Чтение большого файла построчно без загрузки в память

Для работы с большими логами (сотни мегабайт) применяется SplFileObject. Он загружает одну строку за раз.

Пример

<?php
$file = new SplFileObject('/var/log/access.log');
$file->setFlags(SplFileObject::DROP_NEW_LINE);
$lineNumber = 0;
while (!$file->eof()) {
    $line = $file->fgets();
    if ($line !== false) {
        $lineNumber++;
        if (strpos($line, '404') !== false) {
            echo "Строка $lineNumber: $line\n";
        }
    }
}
$file = null; // закрытие файла
?>
Строка 102: 192.168.1.1 - - [01/Apr/2025:12:00:00] 404 232
Строка 205: 10.0.0.2 - - [01/Apr/2025:12:05:00] 404 128

Флаг DROP_NEW_LINE удаляет символы новой строки из каждой прочитанной строки. Для ускорения обработки можно использовать IteratorIterator или NoRewindIterator.

Создание временного файла для безопасной записи

При сохранении загруженных файлов или генерации временных данных удобно использовать tmpfile() или tempnam(). Созданный файл автоматически удалится после закрытия.

Пример

<?php
$tmp = tmpfile();
fwrite($tmp, 'Временные данные');
$meta = stream_get_meta_data($tmp);
echo 'Временный файл: ' . $meta['uri'];
fclose($tmp); // файл удаляется
?>
Временный файл: /tmp/phpXXXXXX

Если нужно получить имя файла до его удаления, используйте tempnam(sys_get_temp_dir(), 'prefix'), он возвращает путь к созданному файлу.

Использование RecursiveDirectoryIterator для рекурсивного обхода

Класс RecursiveDirectoryIterator в паре с RecursiveIteratorIterator позволяет обойти все подпапки и найти все файлы определённого типа.

Пример

<?php
$path = '/var/www/project';
$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::SKIP_DOTS)
);
$result = [];
foreach ($iterator as $file) {
    if ($file->isFile() && $file->getSize() > 1000000) { // файлы больше 1 МБ
        $result[] = $file->getPathname() . ' (' . $file->getSize() . ' байт)';
    }
}
sort($result);
echo implode("\n", $result);
?>
/var/www/project/vendor/autoload.php (2345678 байт)
/var/www/project/images/photo.jpg (1543210 байт)

Флаг SKIP_DOTS автоматически пропускает элементы '.' и '..', упрощая код.

Работа с файлами и папками на PHP - comments

En
Index php file 1 (php)