学习PHP中的目录操作

对于编程语言来说,文件和目录的操作是其最最基础的功能。就像我们日常中最常见的图片上传、文件上传之类的功能,都需要文件和目录操作的支持。今天我们先来简单地学习一下 PHP 中关于目录操作的一些类和函数。

目录与路径分隔符

首先来看看两个常量,它们分别是目录与路径的分隔符号。

echo DIRECTORY_SEPARATOR, PHP_EOL; // /
echo PATH_SEPARATOR, PHP_EOL; // :

DIRECTORY_SEPARATOR 常量在 Linux 系统中输出的就是 / 这个斜杠,而在 Win 系统中则是 \ 这样的反斜杠。也就是说,它是根据当前的操作系统来确定使用哪种目录分隔符号的。PATH_SEPARATOR 是环境路径的分隔符,在 Linux 系统中输出的是 : ,其实就像是我们定义的系统环境变量一样,在 Linux 系统中我们查看或添加修改 PATH 环境变量就都都是使用 : 来分隔的。

Directory 对象操作

既然有对象这个概念,那么也就说明目录相关的操作其实也是有面向对象和面向过程两种形式的,我们先来看看面向对象是如何操作的。

$directory = dir('../');

while(($dir = $directory->read())!== false){
echo $dir, PHP_EOL;
}
// .
// ..
// 1.PHP中的日期相关函数(三).md
// source

我们使用 dir() 函数来返回一个 Directory 对象,这里需要注意的是,Directory 对象是只能通过 dir() 函数来获取的,无法通过 new 的方式来生成实例。在获得 Directory 对象之后,我们就可以通过 read() 方法来读取目录中的所有内容信息了。展示的内容其实和我们在操作系统中使用 ll -a 命令获取的结果是类似的,它会获得 . 、 .. 这两个目录信息,代表当前目录和上级目录。

echo $directory->read(), PHP_EOL;
//

$directory->rewind();
while(($dir = $directory->read())!== false){
echo $dir, PHP_EOL;
}
// .
// ..
// 1.PHP中的日期相关函数(三).md
// source

read() 方法是游标操作,也就是遍历一次后游标就会移动到最后一个位置,这时再调用 read() 就不会有任何信息了。这时我们可以通过 rewind() 方法重置游标,然后就可以重新遍历目录内容。

$directory->close();
// while($dir = $directory->read()){
// echo $dir, PHP_EOL;
// }
// Warning: Directory::read(): supplied resource is not a valid Directory resource

最后就是 close() 方法,用于关闭当前的目录对象句柄。

面向过程 Directory 操作

接下来我们就看看使用面向过程的方式如何获取目录里面的内容,我们同样还是查看相同的这个目录,输出和上面面向对象的方式中同样的信息。

$dirPath = __DIR__;
if(is_dir($dirPath)){
if ($dh = opendir($dirPath)) {
while(($dir = readdir($dh)) !== false){
echo $dir, PHP_EOL;
}
echo readdir($dh), PHP_EOL;


rewinddir($dh);
while(($dir = readdir($dh)) !== false){
echo $dir, PHP_EOL;
}

closedir($dh);
}
}
// .
// ..
// 2.学习PHP中的目录操作.php
// 1.PHP中的日期相关函数(三).php
//
// .
// ..
// 2.学习PHP中的目录操作.php
// 1.PHP中的日期相关函数(三).php

is_dir() 函数用于判断给定的路径是否是一个目录,这个函数相信不少同学都使用过。opendir() 是打开一个给定路径的目录句柄,其实就类似于 dir() 函数来获得 Directory 对象,不过需要注意的是,opendir() 函数返回的是一个句柄资源对象,不是 Directory 对象。然后我们就可以使用 readdir() 函数读取句柄对象中的所有目录信息内容了。

和 Directory 对象中的 read() 方法类似,readdir() 也是游标操作的,当遍历完一次之后,我们可以通过 rewinddir() 函数来重置句柄游标。最后就是 closedir() 函数,同样也是关闭一个句柄资源的函数。

其它目录路径操作

除了遍历查看目录之外,还有其它一些函数辅助我们获得目录相关的信息。

echo getcwd(), PHP_EOL;
// /Users/zhangyue/MyDoc/博客文章

chdir('dev-blog/php/202010');

echo getcwd(), PHP_EOL;
// /Users/zhangyue/MyDoc/博客文章/dev-blog/php/202010

// chdir('dev-blog/php/202013');
// Warning: chdir(): No such file or directory (errno 2)

chdir('/home');
echo getcwd(), PHP_EOL;
// /System/Volumes/Data/home

getcwd() 函数是获取当前运行 PHP 脚本的目录信息。注意,它是你在什么位置运行的 PHP 这个命令脚本的路径,也就是 PHP 程序的工作目录,不是你当前运行的文件的路径。使用 chdir() 可以改变这个目录信息。关于 getcwd() 函数的概念如果不是特别的清楚的话,请一定自己手动测试一下。

print_r(scandir($dirPath));
// Array
// (
// [0] => .
// [1] => ..
// [2] => 1.PHP中的日期相关函数(三).php
// [3] => 2.学习PHP中的目录操作.php
// )

print_r(scandir('/Users'));
// Array
// (
// [0] => .
// [1] => ..
// [2] => .localized
// [3] => Guest
// [4] => Shared
// [5] => share
// [6] => zhangyue
// )

scandir() 函数是列出指定路径中的文件和目录,它的参数必须是一个绝对路径,能够以数组的形式返回所有的内容,在某些情况下非常地方便好用。

总结

关于 PHP 的目录操作相关的内容就是这些,其实还有 mkdir() 之类的函数也是操作目录的,不过在 PHP 官方文档中将它归到了文件操作的讲解中,所以我们也将在后面学习文件操作的时候再进行深入的学习。

测试代码:

​https://github.com/zhangyue0503/dev-blog/blob/master/php/202010/source/2.学习PHP中的目录操作.php​

参考文档:

​https://www.php.net/manual/zh/book.dir.php​