Categories: PHP

PHP 各種列出目錄中所有檔案的做法教學與範例

介紹各種在 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.txtfile3.txtfile4.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

參考資料

Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

9 個月 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

9 個月 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

9 個月 ago

Windows 使用 TPM 虛擬智慧卡保護 SSH 金鑰教學與範例

本篇介紹如何在 Windows...

10 個月 ago

Linux 以 Shamir’s Secret Sharing 分割保存金鑰教學與範例

介紹如何在 Linux 中使用...

11 個月 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

11 個月 ago