PHP 目录


在本教程中,我们将学习如何使用各种PHP函数来处理目录。

PHP目录操作

PHP提供了一组方便的函数使得可以像处理文件一样处理目录。
通过一个目录句柄操作一个目录,该句柄是一个指向目录的特殊变量。

要获得目录句柄,需要将目录路径传递给opendir()函数,如下所示:

1
2
<?php
$dh = opendir('./backup');

如果打开目录时出错,opendir()函数将返回false。目录处理完成后,记得使用closedir()函数关闭目录句柄:

1
2
<?php
closedir($dh);

每个目录可能包含一列文件或子目录,每一条记录称为entry。
其中点号.表示当前目录
两个点..表示父目录。

要获取目录中的下一个entry(文件或目录),需要将目录句柄传递给readdir()函数。

下面的示例向您展示了如何列出备份目录中的所有文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
 
$dh = opendir('./backup');
 
if($dh){
echo '<ul>';
while($e = readdir($dh)){
if($e != '.' && $e != '..'){ // 排除当前目录和父目录
echo '<li>' . $e . '</li>';
}
}
echo '</ul>';
}
 
closedir($dh);

PHP当前目录

默认的当前目录是正在运行的脚本文件的目录。当前目录很重要,因为它被用作相对文件路径的比对目录。

可以使用getcwd()函数获得当前目录。

1
2
3
<?php
 
echo getcwd();

要将当前目录更改为新目录,可以使用chdir()函数:

1
2
3
4
<?php
 
chdir('./backup');
echo getcwd();

调用chdir()函数后,当前目录将更改为新目录。我们可以通过调用getcwd()函数来验证它。

PHP创建目录

要创建目录,可以使用mkdir()函数。
只需将要创建的目录的路径传递给mkdir()函数。
如果mkdir()函数成功创建了目录,则返回true,否则返回false。

1
2
3
4
5
6
7
8
9
10
<?php
 
$dir = './theitroad/2017';
$r = mkdir($dir);
 
if($r){
echo sprintf("%s 目录创建成功。",$dir);
}else{
echo sprintf(" 创建目录 %s 时出错",$dir);
}

请注意,创建目录时,父目录必须存在。

默认情况下,mkdir()函数为新目录设置的权限为0777。如果希望设置不同的权限,可以将其传递给mkdir()函数或使用chmod()函数。

1
2
3
4
<?php
 
$dir = './theitroad/2017';
mkdir($dir,0644);

PHP删除目录

要删除目录,可以使用rmdir()函数。必须具有足够的权限才能删除目录。此外,目录必须为空,就是说它不包含任何文件或子目录。

以下示例将删除/bak/2016目录:

1
2
<?php
rmdir('./bak/2016');

PHP从文件路径获取目录路径

要从文件路径获取目录路径,可以使用dirname()函数,如下所示:

1
2
<?php
echo dirname('./bak/test.txt'); // ./bak

PHP测试文件或目录

PHP把目录和文件都当作文件进行处理。但是目录是一种特殊的文件。要测试一个文件是一个普通的文件还是目录,可以使用一对方便的函数:

  • is_dir()——如果文件路径指向某个目录,则返回true。
  • is_file()——如果文件路径指向一个文件,则返回true。

让我们看下面的例子:

1
2
3
4
5
6
7
8
9
10
<?php
$path = './backup';
 
if(is_dir($path)){
echo sprintf('%s 是一个目录',$path);
}else if(is_file($path)){
echo sprintf('%s 是一个文件',$path);
}else{
echo sprintf('%s 既不是文件也不是目录',$path);
}

PHP列出目录中的文件

下面的示例演示如何递归地列出目录及其子目录中的所有文件。

脚本流程如下:

  1. 读取目录
  2. 如果条目entry是目录,则将其添加到子目录数组($dirs)中。如果是常规文件,请将其添加到文件数组(files)。
  3. 显示目录及其文件。
  4. 对于$dirs数组中的每个子目录,调用函数递归遍历它。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
$path = './bak';
traverse_dir($path);
function display_files($dir, $files) {
echo sprintf("<h2>%s</h2>", $dir);
if (count($files) > 0) {
echo '<ul>';
foreach ($files as $file) {
echo sprintf("<li>%s</li>", $file);
}
echo '</ul>';
}
}
function traverse_dir($path) {
$dh = opendir($path);
$files = array();
$dirs = array();
while ($e = readdir($dh)) {
if ($e != '.' && $e != '..') {
// 检查它是否是一个目录
$f = $path . '/' . $e;
if (is_dir($f)) {
$dirs[] = $f;
} else if (is_file($f)) {
$files[] = $f;
}
}
}
closedir($dh);
// 显示当前目录及其中的文件
display_files($path, $files);
// 递归遍历子目录
foreach ($dirs as $dir) {
traverse_dir($dir);
}
}


原文链接:https://codingdict.com/