Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Папки и пути

Программа работает не только с отдельными файлами, но и с папками: создаёт их для загруженных картинок, перебирает файлы, строит пути. Для этого в 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

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.