Папки и пути
Программа работает не только с отдельными файлами, но и с папками: создаёт их для загруженных картинок, перебирает файлы, строит пути. Для этого в PHP есть отдельный набор функций.
Создание папки
mkdir() создаёт папку. Третий аргумент true разрешает создать сразу всю цепочку вложенных папок:
<?php
$dir = sys_get_temp_dir() . '/shop/images';
if (!is_dir($dir)) {
mkdir($dir, 0777, true);
}
var_dump(is_dir($dir)); // bool(true)Проверка is_dir() нужна, потому что создание уже существующей папки вызывает предупреждение.
Список файлов
scandir() возвращает имена всего, что лежит в папке. Среди них есть служебные . и .. — их убирают:
<?php
$dir = sys_get_temp_dir() . '/notes-demo';
if (!is_dir($dir)) {
mkdir($dir);
}
file_put_contents($dir . '/a.txt', 'A');
file_put_contents($dir . '/b.txt', 'B');
$files = array_diff(scandir($dir), ['.', '..']);
echo implode(', ', $files); // a.txt, b.txtПоиск по маске
glob() находит файлы по шаблону имени и возвращает полные пути:
<?php
$dir = sys_get_temp_dir() . '/glob-demo';
if (!is_dir($dir)) {
mkdir($dir);
}
file_put_contents($dir . '/photo.jpg', '');
file_put_contents($dir . '/notes.txt', '');
$images = glob($dir . '/*.jpg');
echo count($images), ' ', basename($images[0]); // 1 photo.jpgЗвёздочка заменяет любое количество символов.
Части пути
<?php
$path = '/var/www/site/uploads/photo.final.jpg';
echo basename($path), "\n"; // photo.final.jpg
echo dirname($path), "\n"; // /var/www/site/uploads
echo pathinfo($path, PATHINFO_EXTENSION), "\n"; // jpg
echo pathinfo($path, PATHINFO_FILENAME); // photo.finalЭти функции работают со строкой — сам файл может и не существовать.
Путь от текущего файла
Относительный путь зависит от папки, из которой запущена программа. Константа __DIR__ всегда содержит папку текущего файла, поэтому путь от неё надёжен:
<?php
$config = __DIR__ . '/config/app.php';
echo basename($config); // app.phpСведения о файле
<?php
$file = sys_get_temp_dir() . '/info-demo.txt';
file_put_contents($file, 'Привет');
echo filesize($file), "\n"; // 12
var_dump(is_file($file)); // bool(true)
echo date('Y', filemtime($file)) >= 2025 ? 'изменён недавно' : 'старый';filesize() возвращает размер в байтах: шесть русских букв в UTF-8 занимают двенадцать байт. filemtime() — время последнего изменения.
Удаление
unlink() удаляет файл, rmdir() — пустую папку:
<?php
$dir = sys_get_temp_dir() . '/remove-demo';
if (!is_dir($dir)) {
mkdir($dir);
}
file_put_contents($dir . '/temp.txt', '');
unlink($dir . '/temp.txt');
rmdir($dir);
var_dump(is_dir($dir)); // bool(false)Частая ошибка
rmdir() не удаляет папку, в которой что-то есть. Сначала нужно удалить всё её содержимое. И никогда не подставляйте в путь данные от пользователя как есть: строка ../../config.php выведет за пределы разрешённой папки. Оставляйте от имени только последнюю часть:
<?php
$requested = '../../secret/config.php';
echo basename($requested); // config.php