PHP 解析目录

在本教程中,您将学习如何使用PHP处理目录或文件夹。

在PHP中使用目录

在上一章中,您学习了如何在PHP中使用文件。同样,PHP还允许您使用文件系统上的目录,例如,您可以打开目录并读取其内容,创建或删除目录,列出目录中的所有文件,等等。

创建一个新目录

您可以通过 mkdir() 使用要创建的目录的路径和名称来调用 PHP 函数来创建一个新的空目录,如下例所示:

<?php
//目录路径
$dir = "testdir";
 
// 检查目录是否存在
if(!file_exists($dir)){
    //尝试创建目录
    if(mkdir($dir)){
        echo "目录创建成功。";
    } else{
        echo "错误:无法创建目录。";
    }
} else{
    echo "错误:目录已存在。";
}
?>

为了使 mkdir() 函数工作,已经存在于参数的目录路径的父目录,例如,如果你指定的目录路径 testdir/subdirtestdir 以其他方式存在PHP将产生一个错误。

将文件从一个位置复制到另一个位置

您可以通过调用PHP copy()函数并将文件的源路径和目标路径作为参数来将文件从一个位置复制到另一位置。如果目标文件已经存在,它将被覆盖。这是一个在备份文件夹中创建“ example.txt”文件副本的示例。

<?php
//源文件路径
$file = "example.txt";
 
//目标文件路径
$newfile = "backup/example.txt";
 
// 检查文件是否存在
if(file_exists($file)){
    //尝试复制文件
    if(copy($file, $newfile)){
        echo "文件复制成功。";
    } else{
        echo "错误:无法复制文件。";
    }
} else{
    echo "错误:文件不存在。";
}
?>

为了使该示例生效,必须已经存在备份目标目录和源文件“ example.txt”。否则,PHP将产生错误。

列出目录中的所有文件

您可以使用PHP scandir()函数列出指定路径内的文件和目录。

现在,我们将创建一个自定义函数,该函数将使用PHP递归列出目录中的所有文件。如果您正在使用深度嵌套的目录结构,则此脚本将很有帮助。

<?php
//定义一个函数以输出目录中的文件
function outputFiles($path){
    //检查目录是否存在
    if(file_exists($path) && is_dir($path)){
        //扫描此目录中的文件
        $result = scandir($path);
        
        // 过滤掉当前的(.)和父目录(..)
        $files = array_diff($result, array('.', '..'));
        
        if(count($files) > 0){
            //循环遍历重新调谐的数组
            foreach($files as $file){
                if(is_file("$path/$file")){
                    //显示文件名
                    echo $file . "<br>";
                } else if(is_dir("$path/$file")){
                    //如果找到目录,则递归调用该函数
                    outputFiles("$path/$file");
                }
            }
        } else{
            echo "错误:在目录中找不到文件。";
        }
    } else {
        echo "错误:该目录不存在。";
    }
}
 
//调用函数
outputFiles("mydir");
?>		

列出某种类型的所有文件

在处理目录和文件结构时,有时您可能需要查找目录中的某些类型的文件,例如仅列出文件 .text 或 .png 文件等。您可以使用PHP glob()函数轻松地做到这一点,该函数根据模式匹配文件。

以下示例中的PHP代码将搜索 documents 目录并列出所有带有 .text 扩展名的文件。它不会搜索子目录。

<?php
/* 搜索目录并循环浏览,返回包含匹配文件的数组 */
foreach(glob("documents/*.txt") as $file){
    echo basename($file) . " (size: " . filesize($file) . " bytes)" . "<br>";
}
?>

glob()函数还可用于查找目录或其子目录中的所有文件。下例中定义的函数将递归列出目录中的所有文件,就像我们在上例中使用 scandir() 函数 所做的那样。

<?php
//定义函数以输出目录中的文件
function outputFiles($path){
    //检查目录是否存在
    if(file_exists($path) && is_dir($path)){
        // 搜索该目录中的文件
        $files = glob($path ."/*");
        if(count($files) > 0){
            //遍历重新调整的数组
            foreach($files as $file){
                if(is_file("$file")){
                    //仅显示文件名
                    echo basename($file) . "<br>";
                } else if(is_dir("$file")){
                    //如果找到目录,则递归调用该函数
                    outputFiles("$file");
                }
            }
        } else{
            echo "错误:在目录中找不到此类文件。";
        }
    } else {
        echo "错误:该目录不存在。";
    }
}
 
//调用函数
outputFiles("mydir");
?>