PHP Directories
Splitting a Filename into Its Component Parts
Problem
You want to find a file’s path and filename; for example, you want to create a file in the same directory as an existing file.
Solution
Use basename() to get the filename and dirname() to get the path:
$full_name = '/usr/local/php/php.ini';
$base = basename($full_name); // $base is "php.ini"
$dir = dirname($full_name); // $dir is "/usr/local/php"
Use pathinfo() to get the directory name, base name, and extension in an associative array:
$info = pathinfo('/usr/local/php/php.ini');
// $info['dirname'] is "/usr/local/php"
// $info['basename'] is "php.ini"
// $info['extension'] is "ini"
Discussion
To create a temporary file in the same directory as an existing file, use dirname() to find the directory, and pass that directory to tempnam(). For instance:
$dir = dirname($existing_file);
$temp = tempnam($dir,'temp');
$temp_fh = fopen($temp,'w');
The dirname() function is particularly useful in combination with the special constant __FILE__, which contains the full pathname of the current file. This is not the same as the currently executing PHP script. If /usr/local/alice.php includes /usr/local/bob.php, then __FILE__ in bob.php is /usr/local/bob.php.
This makes __FILE__ useful when you want to include or require scripts in the same directory as a particular file, but you don’t know what that directory is and it isn’t necessarily in the include path. For example:
$currentDir = dirname(__FILE__);
include $currentDir . '/functions.php';
include $currentDir . '/classes.php';
If this code is in the /usr/local directory, then it includes /usr/local/functions.php and /usr/local/classes.php. This technique is particularly useful when you’re distributing code for others to use. With it, you don’t have to require any configuration or include path modification for your code to work properly. As of PHP 5.3, you use the constant __DIR__ instead of dirname(__FILE__).
Using functions such as basename(), dirname(), and pathinfo() is more portable than just splitting up full filenames on the / character because the functions use an operating system–appropriate separator. On Windows, these functions treat both / and \ as file and directory separators. On other platforms, only / is used.
There’s no built-in PHP function to combine the parts produced by basename(), dirname(), and pathinfo() back into a full filename. To do this, combine the parts with . and the built-in DIRECTORY_SEPARATOR constant, which is / on Unix and \ on Windows.
No comments:
Post a Comment