介紹各種在 PHP 中列出目錄下所有檔案或子目錄的方法,並提供基本的範例程式碼。
glob 函數
PHP 的 glob 函數 可以篩選出符合條件的檔案或目錄名稱。
例如列出目前目錄之下所有 *.txt 文字檔案:
<?php
# 列出所有 *.txt 文字檔案
foreach (glob("*.txt") as $filename) {
echo "$filename 檔案大小:" . filesize($filename) . "\n";
}
?>
file1.txt 檔案大小:35 file2.txt 檔案大小:159 file3.txt 檔案大小:70 file4.txt 檔案大小:31
也可以使用絕對路徑來列出指定目錄下的檔案:
<?php
# 列出指定路徑下的文字檔案
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 這三個檔案,就可以使用以下程式碼:
<?php
# 列出 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 函數列出目前目錄下所有檔案或子目錄:
<?php
# 列出指定路徑下的所有檔案
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
亦可使用絕對路徑列出指定路徑下的所有檔案名稱或子目錄:
<?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
通常我們都會將 . 與 .. 這兩個特殊目錄去除:
<?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 這類的函數,以正規表示法根據檔案名稱來篩選需要的項目:
<?php
# 指定目錄路徑
$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 函數也可以用來取得指定目錄之下的所有檔案與子目錄名稱:
<?php
# 開啟目錄
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 以正規表示法根據檔案名稱篩選出文字檔案:
<?php
# 開啟目錄
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
