有時候會需要寫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 . ' br>';
}
closedir($handle);
golb真是超強大的 不過如果沒有做好參數的消毒也會非常危險XD
話說他可以往上一層看嘛XD
如果可以真的很可怕
剛剛測試了一下 真的還蠻恐怖的
http://i.min.us/idmOpXbQ1.PNG
../ 超好用 要小心 XXD
呵呵
這樣等於主機資料看光光0.0
是很方便…
不過如果做網路硬碟分享檔案
可能出現非BIG5編碼的文字
這些函數都不能用了…
挑錯字~
>>例如在做網路硬碟程式時舊需要這種功能
是 “就需要這種功能”
PHP本身就是用utf8的
應該沒問題才對
你那個到底怎樣我也不懂@@
其實阿PHP下面可以轉換編碼
只要轉個編碼再輸出就好
$output = iconv(“UTF-8″,”big5”,$input);
試了試
用中文、日文、英文當檔名建立檔案
在WINDOWS下,都是用UNICODE,沒什麼問題
支援UNICODE的程式都可以直接讀取
在地區語言選項中
可以設定當程式不支援UNICODE時,要用哪種語言處理
使用scandir
在設成中文(台灣)時,中、英文可正常顯示
設成日文時,日、英文可以正常顯示
最後設成英文(美國),只有英文能顯示,其他皆為”?”
也就是說,PHP不支援UNICODE
官網也說了,要到PHP6才可能會支援UNICODE
也造成了在中文環境下,PHP能放到中文目錄執行而日文目錄不行
而在日文環境,在部分中文目錄會無法執行
試試 iconv(“big-5″,”UTF-8”,$file);
我是用這樣解決的。 (主機是用美國的Bluehost時遇到這樣的問題)
沒想到有 glob 這麼好用的函式 Q口Q !!
我前陣子做案子時竟然還傻傻地用 readdir 取出來
然後再用 foreach 比對我要的檔案 Orz
=))
glob贊啦~
未看先 debug … XD
s/例如在做網路硬碟程式時舊需要這種功能/例如在做網路硬碟程式時就需要這種功能/
感謝分享~