Задача
Необходимо определить путь к файлу и его имя; например, требуется создать файл в том же каталоге, в котором находится существующий.
Решение
Для выделения имени файла применяется функция basename(), а функция dirname() – для выделения пути к нему:
$full_name = '/usr/local/php/php.ini';
$base = basename($full_name); // значение переменной $base равно php.ini
$dir = dirname($full_name); // значение переменной $dir
равно /usr/local/php
Функция pathinfo() позволяет получить из ассоциативного массива имя каталога, базовое имя и расширение:
$info = pathinfo('/usr/local/php/php.ini');
Обсуждение
Для создания временного файла в каталоге существующего файла вызовите функцию dirname(), чтобы найти каталог, и передайте его функции tempnam():
$dir = dirname($existing_file);
$temp = tempnam($dir,'temp');
$temp_fh = fopen($temp,'w');
Элементы ассоциативного массива, возвращенные функцией pathinfo(), – это dirname, basename и extension:
$info = pathinfo('/usr/local/php/php.ini');
print_r($info);
Array
(
[dirname] => /usr/local/php
[basename] => php.ini
[extension] => ini
)
Можно также передать функции basename() необязательный суффикс, чтобы удалить его из имени файла. В этом случае переменная $base получит значение php:
$base = basename('/usr/local/php/php.ini','.ini');
Применение функций basename(), dirname() и pathinfo() более переносимо, чем просто разделение полного имени файла символом /, поскольку в них используется разделитель, соответствующий операционной системе. В Windows эти функции считают разделителем каталогов и /, и \.
На других платформах используется только символ /.
В PHP нет встроенной функции для обратного объединения в полное имя файла частей, возвращенных функциями basename(), dirname() и pathinfo(). Чтобы сделать это, надо объединить части с помощью символов . и /:
$dirname = '/usr/local/php';
$basename = 'php';
$extension = 'ini';
$full_name = $dirname . '/' . $basename . '.' . $extension;
Можно спокойно передать полученное таким образом полное имя файла файловой функции PHP в Windows, поскольку PHP в Windows принимает символ / в качестве разделителя каталогов.