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");
?>