PHP 解析目录

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

使用 PHP 中的目录

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

创建新目录

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

<?php
// The directory path
$dir = "testdir";
 
// Check the existence of directory
if(!file_exists($dir)){
    // Attempt to create directory
    if(mkdir($dir)){
        echo "Directory created successfully.";
    } else{
        echo "ERROR: Directory could not be created.";
    }
} else{
    echo "ERROR: Directory already exists.";
}
?>

为了使 mkdir() 函数工作,在目录路径参数的父目录必须已经存在,例如,如果你指定目录路径 testdir/subdir,那么 testdir 必须已经存在,否则 PHP 将产生一个错误。

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

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

<?php
// Source file path
$file = "example.txt";
 
// Destination file path
$newfile = "backup/example.txt";
 
// Check the existence of file
if(file_exists($file)){
    // Attempt to copy file
    if(copy($file, $newfile)){
        echo "File copied successfully.";
    } else{
        echo "ERROR: File could not be copied.";
    }
} else{
    echo "ERROR: File does not exist.";
}
?>

为了使这个例子工作,目标目录 backup 和源文件即 example.txt 必须已经存在; 否则 PHP 将生成错误。

列出目录中的所有文件

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

现在我们要创建一个自定义函数,它将使用 PHP 以递归方式列出目录中的所有文件。如果你正在使用深层嵌套的目录结构,那么此脚本将非常有用。

<?php
// Define a function to output files in a directory
function outputFiles($path){
    // Check directory exists or not
    if(file_exists($path) && is_dir($path)){
        // Scan the files in this directory
        $result = scandir($path);
        
        // Filter out the current (.) and parent (..) directories
        $files = array_diff($result, array('.', '..'));
        
        if(count($files) > 0){
            // Loop through retuned array
            foreach($files as $file){
                if(is_file("$path/$file")){
                    // Display filename
                    echo $file . "<br>";
                } else if(is_dir("$path/$file")){
                    // Recursively call the function if directories found
                    outputFiles("$path/$file");
                }
            }
        } else{
            echo "ERROR: No files found in the directory.";
        }
    } else {
        echo "ERROR: The directory does not exist.";
    }
}
 
// Call the function
outputFiles("mydir");
?>

列出某种类型的所有文件

在处理目录和文件结构时,有时你可能需要查找目录中的某些类型的文件,例如,仅列出文件 .text.png 文件等。你可以使用 PHP glob() 函数轻松完成此操作,该函数根据模式匹配文件。

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

<?php
/* Search the directory and loop through
returned array containing the matched files */
foreach(glob("documents/*.txt") as $file){
    echo basename($file) . " (size: " . filesize($file) . " bytes)" . "<br>";
}
?>

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

<?php
// Define a function to output files in a directory
function outputFiles($path){
    // Check directory exists or not
    if(file_exists($path) && is_dir($path)){
        // Search the files in this directory
        $files = glob($path ."/*");
        if(count($files) > 0){
            // Loop through retuned array
            foreach($files as $file){
                if(is_file("$file")){
                    // Display only filename
                    echo basename($file) . "<br>";
                } else if(is_dir("$file")){
                    // Recursively call the function if directories found
                    outputFiles("$file");
                }
            }
        } else{
            echo "ERROR: No such file found in the directory.";
        }
    } else {
        echo "ERROR: The directory does not exist.";
    }
}
 
// Call the function
outputFiles("mydir");
?>