8.3 文件和目录的通用操作
有的函数既能操作文件也能操作目录,有的操作既要操作目录又要操作文件,所以文件和目录的操作有时候并没有明显的界线,本节将介绍一些文件和目录的通用操作。
8.3.1 获取路径中的文件名和目录名
调用函数basename()可以取得一个路径中的文件名部分,语法如下。
string basename(string $path);
参数$path是完整的路径名,该函数返回指定路径$path中的文件名部分。在Windows系统中,可以使用/或\作为目录分隔符,在UNIX系统中,使用/作为目录分隔符。
调用函数dirname()可以取得一个路径中的目录名部分,语法如下。
string dirname(string $path);
参数$path是完整的路径名,该函数返回指定路径$path中的目录名。
代码8-8演示了这两个函数的用法。
代码8-8 使用函数basename()和dirname()获取文件名和目录名8-8.php
01 <?php 02 $path = "/home/prog/php/sayHello.php"; // 完整的包含路径名的文件 03 04 $file_name = basename($path); // 获取完整路径中的文件名 05 $dir_name = dirname($path); // 获取完整路径中的目录名 06 07 echo " 完整路径:".$path; 08 echo "<hr>"; 09 echo "<br/>"; 10 11 echo " 其中目录名为:".$dir_name; // 输出目录名 12 echo "<br/>"; 13 echo " 其中文件名为:".$file_name; // 输出文件名 14 echo "<br/>"; 15 ?>
【代码解析】网络上传文件时经常需要判断文件的路径和名称,代码第04~05行很好地演示了获取这两个属性的过程。这段代码的执行结果如图8-10所示。
8.3.2 判断文件或目录是否存在
调用函数file_exists()可以检查指定的文件或目录是否存在,语法如下。
bool file_exists(stirng $filename);
该函数判断由参数$filename指定的文件或目录是否存在,如果存在,函数返回TRUE,否则函数返回FALSE。代码8-9演示了该函数的用法。
代码8-9 判断文件或目录是否存在8-9.php
01 <?php 02 $file = "data.txt"; // 文件名 03 $dir = "info/newdata"; // 目录名 04 05 if(file_exists($file)) // 判断文件是否存在 06 { 07 echo " 当前目录中,文件".$file." 存在"; 08 echo "<br/>"; 09 } 10 else 11 { 12 echo " 当前目录中,文件".$file." 不存在"; 13 echo "<br/>"; 14 } 15 echo "<br/>"; 16 echo "<hr>"; 17 echo "<br/>"; 18 19 if(file_exists($dir)) // 判断目录是否存在 20 { 21 echo " 当前目录下,目录".$dir." 存在"; 22 echo "<br/>"; 23 } 24 else 25 { 26 echo " 当前目录下,目录".$dir." 不存在"; 27 echo "<br/>"; 28 } 29 ?>
【代码解析】代码第02行定义了一个文件名,第03行定义了一个目录,第05行判断文件是否存在,第19行判断目录是否存在。这段代码的执行结果如图8-11所示。
图8-10 使用PHP函数获取路径中的目录名和文件名
图8-11 使用PHP函数判断文件和目录是否存在
8.3.3 建立目录和删除目录
PHP提供了如下函数在文件系统中建立目录和删除目录,在PHP程序中可以很方便地使用它们。
·函数mkdir($pathname,$mode),用来创建一个目录。参数$pathname指要创建的目录的路径或名称,参数$mode指所建目录的访问权限,它通常是指UNIX系统下的访问权限。如果目录创建成功,函数返回TRUE,否则返回FALSE。
·函数rmdir($pathname),用来删除一个目录。参数$pathname指要删除的目录,但该目录必须是空目录,并且在UNIX下,该目录要有相应的删除权限。如果目录删除成功,函数返回TRUE,否则返回FALSE。
代码8-10演示了这两个函数的用法。
代码8-10 使用函数创建并删除目录8-10.php
01 <?php 02 $dir_name = "tmp_data"; // 一个目录名 03 04 if(mkdir($dir_name)) // 在当前目录下创建目录tmp_data 05 { 06 echo " 目录".$dir_name." 创建成功!"; 07 08 // 在目录tmp_data 中创建一个文件tmp.txt ,并向其中写入一些内容 09 if($fp = fopen($dir_name."/tmp.txt",'a')) 10 { 11 if(fwrite($fp,"Put Some Contenets into File.")) 12 { 13 echo "<hr>"; 14 echo " 在目录".$dir_name." 下创建文件tmp.txt"; 15 } 16 } 17 } 18 else 19 { 20 echo " 创建目录失败!"; 21 exit; 22 } 23 echo "<hr>"; 24 25 if(rmdir($dir_name)) // 尝试删除目录tmp_data 26 { 27 echo " 删除目录".$dir_name." 成功!"; 28 } 29 else 30 { 31 echo " 删除目录失败!"; 32 exit; 33 } 34 ?>
【代码解析】这段代码首先在当前目录下创建名为tmp_data的目录,如果创建成功,则在该目录下创建一个名叫tmp.txt的文件,并向其写入一些内容。接着,程序使用函数rmdir()删除刚刚创建的目录tmp_data,如果前面的文件创建成功,说明目录tmp_data不为空,则调用函数rmdir()删除目录会失败。程序的执行结果如图8-12所示。
说明 读者的演示效果可能与笔者不同,因为如果是XP系统,则全部代码可能顺利运行,如果是Windows 7系统,由于用户控制权限的不同,所以可能输出效果会不同。当然,如果已经存在这个文件或打开了这个文件,也有创建失败的可能。
8.3.4 复制、删除和移动文件
在PHP中,复制、删除和移动文件也可以通过其提供的预定义函数完成。下面列举了用于复制、删除和移动文件的函数。
·函数copy($source,$desc),用来把文件从参数$source指定的位置,复制到由参数$desc指定的位置。如果复制成功,该函数返回TRUE,否则该函数返回FALSE。
·函数unlink($file),用来删除由参数$file指定的文件。如果删除成功,该函数返回TRUE,否则返回FALSE。
·函数rename($oldname,$newname),用来把由参数$oldname指定的文件重命名为由参数$newname指定的名字。这两个参数都可以是一个带文件名的完整路径,从而完成文件从一个目录到另一个目录的移动。
代码8-11演示了这些函数的用法。
代码8-11 使用函数复制并删除文件8-11.php
01 <?php 02 $dir_name = "tmp_data"; // 目录名 03 $new_file = "tmp_new.txt"; // 文件名 04 05 if(!copy($dir_name."/tmp.txt",$new_file)) // 复制文件 06 { 07 echo "Copy 文件tmp.txt 失败"; 08 exit; 09 } 10 11 echo " 文件tmp.txt 复制成功"; 12 echo "<br/>"; 13 echo "<br/>"; 14 echo "<hr>"; 15 echo "<br/>"; 16 17 if(unlink($new_file)) // 删除指定的文件 18 { 19 echo " 文件".$new_file." 删除成功"; 20 } 21 else 22 { 23 echo " 文件".$new_file." 删除失败"; 24 } 25 ?>
【代码解析】这段代码首先将8.3.3小节由代码8-10创建的目录tmp_data下的文件tmp.txt复制到当前目录下,同时重新命名为tmp_new.txt。然后,使用函数unlink()删除文件tmp_new.txt。如果一切正常,该函数的执行结果如图8-13所示。
图8-12 使用PHP的函数创建和删除目录
图8-13 复制并删除文件