一、readdir函數介紹
readdir函數是PHP自帶的一個函數,用於讀取一個目錄中的所有文件和子目錄。readdir的語法如下:
bool readdir ( resource $dir_handle )
其中,dir_handle是返回的文件句柄,通過執行opendir函數打開目錄返回。readdir函數每次執行會返回目錄中的下一個文件名,如果到達了目錄的末尾,則返回false。
當使用readdir函數時,需要注意的是,該函數只返迴文件名,而不包含文件的路徑,因此需要通過將文件名與路徑進行拼接來獲取文件的完整路徑。同時,返回的文件名包括.和..兩個特殊文件,因此需要進行判斷處理。
二、使用readdir遍歷目錄
假設當前有一個目錄folder,需要遍歷該目錄下的所有文件和子目錄,可以通過以下代碼實現:
$dir = './folder'; // 目錄路徑 $handle = opendir($dir); // 打開目錄 if ($handle) { while (false !== ($file = readdir($handle))) { if ($file != '.' && $file != '..') { // 排除.和..文件 $filepath = $dir . '/' . $file; // 拼接文件路徑 if (is_file($filepath)) { echo "文件:{$file}
"; } elseif (is_dir($filepath)) { echo "目錄:{$file}
"; } } } closedir($handle); // 關閉目錄句柄 }
上述代碼中,使用opendir函數打開目錄,然後通過while循環遍歷目錄中的所有文件和子目錄。在遍歷過程中,判斷當前文件是否為.或..文件,如果不是,則通過is_file和is_dir函數判斷該文件是文件還是目錄,並進行相應的處理。
三、遍歷目錄的排序與過濾
1. 文件排序
如果需要按照一定的順序遍歷目錄中的所有文件,則可以在遍歷之前先對目錄中的所有文件進行排序。
PHP提供了scandir函數,可以返回指定目錄中的所有文件和子目錄,並按指定方式排序。scandir的語法如下:
array scandir ( string $directory , int $sorting_order = SCANDIR_SORT_ASCENDING , resource $context = ? )
其中,directory是要掃描的目錄;sorting_order是可選參數,表示排序方式,可選值為SCANDIR_SORT_ASCENDING(按照字母升序排序)和SCANDIR_SORT_DESCENDING(按照字母降序排序);context是可選參數,表示上下文信息,可忽略。
例如,按照文件名逆序排序,可以使用以下代碼:
$dir = './folder'; // 目錄路徑 $files = scandir($dir, SCANDIR_SORT_DESCENDING); // 掃描目錄並按文件名逆序排序 foreach ($files as $file) { if ($file != '.' && $file != '..') { // 排除.和..文件 $filepath = $dir . '/' . $file; // 拼接文件路徑 if (is_file($filepath)) { echo "文件:{$file}
"; } elseif (is_dir($filepath)) { echo "目錄:{$file}
"; } } }
2. 文件過濾
在遍歷目錄時,可能需要根據一定的規則對文件進行過濾。PHP提供了glob函數,可以返回匹配指定規則的文件列表。glob的語法如下:
array glob ( string $pattern , int $flags = 0 )
其中,pattern是指定的規則,可以使用通配符進行匹配,如*.txt表示匹配所有擴展名為txt的文件;flags是可選參數,表示搜索時的行為,包括GLOB_MARK(在每個匹配後面加上一個斜線)、GLOB_NOSORT(不排序)等。
例如,過濾出所有擴展名為txt的文件,可以使用以下代碼:
$dir = './folder'; // 目錄路徑 $files = glob($dir . '/*.txt'); // 獲取所有擴展名為txt的文件列表 foreach ($files as $file) { $filename = basename($file); // 獲取文件名 echo "文件:{$filename}
"; }
3. 子目錄遍歷
如果需要遍歷目錄下的所有子目錄,可以使用遞歸函數來實現。遍歷過程中,遇到子目錄則對子目錄進行遞歸調用。
例如,遍歷目錄下的所有文件和子目錄,可以使用以下代碼:
function traverse($dir) { $handle = opendir($dir); // 打開目錄 if ($handle) { while (false !== ($file = readdir($handle))) { if ($file != '.' && $file != '..') { // 排除.和..文件 $filepath = $dir . '/' . $file; // 拼接文件路徑 if (is_file($filepath)) { echo "文件:{$file}
"; } elseif (is_dir($filepath)) { echo "目錄:{$file}
"; traverse($filepath); // 遞歸遍歷子目錄 } } } closedir($handle); // 關閉目錄句柄 } } $dir = './folder'; // 目錄路徑 traverse($dir);
上述代碼中,定義了一個名為traverse的遞歸函數,用於遍歷指定目錄及其子目錄。在遍歷子目錄時,對子目錄進行遞歸調用,直到遍歷完所有子目錄。
四、總結
使用readdir函數可以很方便地遍歷指定目錄中的所有文件和子目錄,配合其他函數如scandir和glob可以實現更多的功能。同時,需要注意在遍歷過程中對特殊文件.和..進行排除處理,以及對文件路徑的拼接。
原創文章,作者:LUVV,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/131152.html