介紹各種在 PHP 中列出目錄下所有檔案或子目錄的方法,並提供基本的範例程式碼。
glob
函數PHP 的 glob
函數 可以篩選出符合條件的檔案或目錄名稱。
例如列出目前目錄之下所有 *.txt
文字檔案:
# 列出所有 *.txt 文字檔案 foreach (glob("*.txt") as $filename) { echo "$filename 檔案大小:" . filesize($filename) . "\n"; }
file1.txt 檔案大小:35 file2.txt 檔案大小:159 file3.txt 檔案大小:70 file4.txt 檔案大小:31
也可以使用絕對路徑來列出指定目錄下的檔案:
# 列出指定路徑下的文字檔案 foreach (glob("/home/ubuntu/tmp/php/*.txt") as $filename) { echo "$filename 檔案大小:" . filesize($filename) . "\n"; }
/home/ubuntu/tmp/php/file1.txt 檔案大小:35 /home/ubuntu/tmp/php/file2.txt 檔案大小:159 /home/ubuntu/tmp/php/file3.txt 檔案大小:70 /home/ubuntu/tmp/php/file4.txt 檔案大小:31
使用中括號([]
)可以指定匹配的字元,例如若要列出目前目錄之下的 file2.txt
、file3.txt
與 file4.txt
這三個檔案,就可以使用以下程式碼:
# 列出 file2.txt、file3.txt 與 file4.txt 文字檔案 foreach (glob("file[2-4].txt") as $filename) { echo "$filename 檔案大小:" . filesize($filename) . "\n"; }
file2.txt 檔案大小:159 file3.txt 檔案大小:70 file4.txt 檔案大小:31
scandir
函數使用 scandir
函數列出目前目錄下所有檔案或子目錄:
# 列出指定路徑下的所有檔案 foreach (scandir(".") as $item) { if (is_dir($item)) { echo "目錄:$item\n"; } else { echo "檔案:$item\n"; } }
目錄:. 目錄:.. 檔案:file1.txt 檔案:file2.txt 檔案:file3.txt 檔案:file4.txt 目錄:folder1 目錄:folder2 檔案:script.php
亦可使用絕對路徑列出指定路徑下的所有檔案名稱或子目錄:
# 列出指定路徑下的所有檔案或子目錄 foreach (scandir("/home/ubuntu/tmp/php") as $item) { if (is_dir($item)) { echo "目錄:$item\n"; } else { echo "檔案:$item\n"; } }
目錄:. 目錄:.. 檔案:file1.txt 檔案:file2.txt 檔案:file3.txt 檔案:file4.txt 目錄:folder1 目錄:folder2 檔案:script.php
通常我們都會將 .
與 ..
這兩個特殊目錄去除:
# 指定目錄路徑 $directory = '/home/ubuntu/tmp/php'; # 列出所有檔案或目錄,去除「.」與「..」目錄 $items = array_diff(scandir($directory), array('..', '.')) # 輸出檔案或目錄 foreach ($items as $item) { if (is_dir($item)) { echo "目錄:$item\n"; } else { echo "檔案:$item\n"; } }
檔案:file1.txt 檔案:file2.txt 檔案:file3.txt 檔案:file4.txt 目錄:folder1 目錄:folder2 檔案:script.php
更近一步可以使用 preg_grep
這類的函數,以正規表示法根據檔案名稱來篩選需要的項目:
# 指定目錄路徑 $directory = '/home/ubuntu/tmp/php'; # 以正規表示法篩選出 *.txt 的檔案 $txtItems = preg_grep("/\.txt$/", scandir($directory)); # 輸出 *.txt 檔案 foreach ($txtItems as $item) { echo "$item\n"; }
file1.txt file2.txt file3.txt file4.txt
readdir
函數readdir
函數也可以用來取得指定目錄之下的所有檔案與子目錄名稱:
# 開啟目錄 if ($handle = opendir('.')) { # 取得目錄內的檔案或子目錄 while (false !== ($entry = readdir($handle))) { # 去除「.」與「..」目錄 if ($entry != '.' && $entry != '..') { if (is_dir($entry)) { echo "目錄:$entry\n"; } else { echo "檔案:$entry\n"; } } } closedir($handle); }
檔案:file4.txt 檔案:file2.txt 目錄:folder1 檔案:file3.txt 檔案:script.php 檔案:file1.txt 目錄:folder2
搭配 preg_match
以正規表示法根據檔案名稱篩選出文字檔案:
# 開啟目錄 if ($handle = opendir('.')) { # 取得目錄內的檔案或子目錄 while (false !== ($entry = readdir($handle))) { # 篩選出 *.txt 檔案 if (preg_match("/.txt$/", $entry)) { echo "$entry\n"; } } closedir($handle); }
file4.txt file2.txt file3.txt file1.txt