Как в PHP извлечь информацию, содержащуюся в пути и имени файла?

как в php извлечь информацию, содержащуюся в пути и имени файла?

Общая структура имени файла

Строковое представление имени файла состоит из нескольких частей: относительный или абсолютный путь директории, текстовый идентификатор и расширение. Множество задач требуют получения информации, хранящейся в такой строке. Например, при сохранении нового файла необходимо проверить его будущую директорию на существование. В РHP такие задачи можно решить несколькими способами. Однако имеется набор специальных встроенных функций.

Для получения всей информации из пути и имени файла есть функция pathinfo(). Первый её параметр является обязательным. Он ожидает получить строку, содержащую имя файла. Если второй параметр остается не заполненным, функция вернет ассоциативный массив, имеющий следующие поля: dirname — путь до директории расположения, basename — имя файла, включая расширение, extension — расширение файла, filename — имя файла без расширения. Если что-либо из этого списка отсутствует в строке, то поле не будет создано.

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

Список специальных констант функции pathinfo:

  • PATHINFO_DIRNAME — извлечение места расположения файла.
  • PATHINFO_BASENAME — извлечение имени файла с расширением.
  • PATHINFO_EXTENSION — извлечение только расширения.
  • PATHINFO_FILENAME — извлечение имени файла без расширения.
//разбираем общую структуру имени и пути файла
$fileName = '/home/username/photos/garden.jpg';
$pathData = pathinfo($fileName);

echo $pathData['dirname'].   '<br>';
echo $pathData['basename'].  '<br>';
echo $pathData['extension']. '<br>';
echo $pathData['filename'].  '<br>';
/*
* Результат:
* /home/username/photos
* garden.jpg
* jpg
* garden
*/


//выделяем конкретные участки из общей структуры
var_dump(pathinfo($fileName, PATHINFO_BASENAME));
//Результат: string('garden.jpg')

var_dump(pathinfo('', PATHINFO_EXTENSION));
//Результат: string('')

Выделение имени файла или каталога

Помимо pathinfo(), выполняющей общие задачи, PHP имеет две специализированные функции: basename() - получение имени и расширения файла, dirname() - извлечение директории.

Функция basename() принимает два параметра, но только первый является обязательным. Он ожидает получить строку, содержащую полное имя файла. Во втором параметре можно указать суффикс имени файла. Он также является строкой и нужен для отсечения лишней части у результата. Например, именем файла является строка «players-scores.xlsx», суффикс заданный как «.xlsx» заставит функцию basename() вернуть строку «players-scores».

//получем полное имя файла с расширением и без него
$fileName = '/some-dirname/garden.jpg';
echo basename($fileName);         //Результат: garden.jpg
echo basename($fileName, '.jpg'); //Результат: garden

Функция dirname() возвращает имя каталога из переданного пути. Её действие противоположно предыдущей функции. В качестве первого параметра она принимает строку, содержащую определение пути в файловой системе. Второй параметр является не обязательным и задается целочисленным значением. Он определяет, сколько уровней вложенности нужно откинуть. Например, задав второй параметр значением 2 для определения пути «/var/lib/test/some-file.txt», вы получите результат «/var». Если оставить второй параметр не заданным или установить его в значение по умолчанию «0», возвратится весь путь «/var/lib/test».

//получем разные уровни вложенности директории
$fileName = '/first-level/second-level/some-file.txt';
echo dirname($fileName); //Результат: /first-level/second-level
echo dirname($fileName, 2); //Результат: /first-level

//строка не содержит слешей, а только имя файла
echo dirname('only-filename.txt'); //Результат: .

Заметка
Если в строке, переданной функции dirname(), не содержится ни одного слеша, будет возвращено значение «.». Такое поведение является логичным. Если в строке нет слешей, то определение директории отсутствует. Это значит, что, скорее всего, строка является именем файла в текущей директории.

Преобразование относительного пути в абсолютный

Иногда пути указываются относительно текущего местоположения. Например, строка «../temp/some-file.txt» говорит о том, что файл с именем «some-file.txt» лежит на одну директорию выше текущей в папке «temp». Преобразовать такой путь к абсолютному значит, перестроить его относительно корня файловой системы.

PHP имеет встроенную функцию realpath(). Она принимает всего один строковой параметр, в котором указывается путь в файловой системе. При формировании абсолютного пути учитываются символические ссылки. Если передать в качестве параметра пустую строку или null, будет возвращен абсолютный путь до текущей директории.

//переходим в домашний каталог и получаем его полный путь
chdir('/home/username/videos');
echo realpath('../programms');
//Результат: /home/username/programms

Заметка
Особенностью функции realpath() является то, что она непросто преобразует строку, но и взаимодействует с файловой системой. Если файл являющейся конечной точкой пути не существует, функция вернет false. Если текущий пользователь не имеет прав доступа к какой-либо директории в пути, функция также вернет false.

Последние публикации