乐趣区

关于php:学习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

各自媒体平台均可搜寻【硬核项目经理】

退出移动版