【PHP】透過glob、scandir、readdir取得資料夾內的檔案列表

有時候會需要寫PHP程式去取得指定資料夾內的檔案列表,例如在做網路硬碟程式時舊需要這種功能,這裡要跟大家介紹三個函式都可以做到這種功能,只是使用上不太一樣,這三個函式分別是glob、scandir、readdir

P.S.感謝網友蒼時弦也、白目捷的指正:)

一、glob

我個人比較推薦glob,他可以使用含有「萬用字元」的字串當做參數,取得檔案列表,例如./temp裡面有五個txt檔案、十個jpg檔,現在我只要取得jpg的檔案列表,那就寫成:glob(‘./temp/*.jpg’);,然後就會回傳Array,裡面就是jpg的檔案列表,如果要取得所有檔案,則語法為:glob(./temp/*.*);

格式:glob($pattern);

$pattern算是一個…. 你可以把它直接理解成資料夾路徑,然後可以使用萬用字元的意思,就像上面解釋的一樣

範例:

glob('./temp/*.txt');     //只會取得txt附檔名的檔案
glob('./temp/*.jpg');     //只會取得jpg附檔名的檔案

另外glob的第二個參數可以指定陣列的排序方法,相關介紹可以到官網查詢:http://php.net/manual/en/function.glob.php

二、scandir

scandir也算是蠻好用的一個函式,他的回傳值也一樣是Array,回傳值的第一項是「.」,就是目前資料夾的意思,第二項是「..」也就是上一個資料夾,但是他沒辦法像glob那樣指定到檔案格式,scandir的格式是:

scandir($dir_address);

範例:

scandir('./temp');
/*
會取得所有./temp下的資料,包括10個jpg以及5個txt
*/

三、readdir

readdir這個函式讓我一度有錯覺懷疑他根本沒有出現的必要,他的使用很麻煩,功能又不像glob那麼強大,要使用他必須要先開啟資料夾(opendir),然後把檔案代碼傳到readdir才可以使用,用完之後還要closedir,除了這點比較麻煩以外,他的回傳值是String,執行一次讀取一次,也就是他執行時會取得第一項檔案的資料,在執行第二次會取得第二筆資料,運作上跟mysql_fetch_row一樣,除此之外他的回傳值格式跟scandir一樣,第一個是「.」,第二個是「..」

官方文件:http://php.net/manual/en/function.readdir.php

範例:

$handle=opendir('C:UserslinroexDropboxmusic');
while(false!==($file=readdir($handle))){
	echo $file . '';
}

closedir($handle);

13 thoughts on “【PHP】透過glob、scandir、readdir取得資料夾內的檔案列表”

  1. 是很方便…
    不過如果做網路硬碟分享檔案
    可能出現非BIG5編碼的文字
    這些函數都不能用了…

    挑錯字~
    >>例如在做網路硬碟程式時舊需要這種功能
    是 “就需要這種功能”

    1. 試了試

      用中文、日文、英文當檔名建立檔案
      在WINDOWS下,都是用UNICODE,沒什麼問題
      支援UNICODE的程式都可以直接讀取

      在地區語言選項中
      可以設定當程式不支援UNICODE時,要用哪種語言處理

      使用scandir
      在設成中文(台灣)時,中、英文可正常顯示
      設成日文時,日、英文可以正常顯示
      最後設成英文(美國),只有英文能顯示,其他皆為”?”

      也就是說,PHP不支援UNICODE
      官網也說了,要到PHP6才可能會支援UNICODE

      也造成了在中文環境下,PHP能放到中文目錄執行而日文目錄不行
      而在日文環境,在部分中文目錄會無法執行

    2. 試試 iconv(“big-5″,”UTF-8”,$file);
      我是用這樣解決的。 (主機是用美國的Bluehost時遇到這樣的問題)

  2. 沒想到有 glob 這麼好用的函式 Q口Q !!
    我前陣子做案子時竟然還傻傻地用 readdir 取出來
    然後再用 foreach 比對我要的檔案 Orz

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料