PHP中的目錄遍歷
阿新 • • 發佈:2020-10-15
函式 返回型別 描述
opendir 資源控制代碼 得到指定目錄的資源控制代碼
is_dir 布林 判斷是否為目錄
is_readable 布林 給定目錄是否可讀
readdir 字串 通過資源控制代碼中讀一個檔案的檔名,指標後移,如果不存 在或者已在最後的話在返回false
closedir void 關閉資源控制代碼,釋放資源
scandir 陣列 返回指定目錄下所有的檔案和目錄組成的陣列
遍歷指定資料夾中的檔案
該段程式碼完成對指定目錄中檔案與目錄的的基本遍歷,其中 readdir
遍歷指定資料夾下指定型別的檔案
多數情況下,我們對目錄的遍歷往往要受限於某些條件,例如,我們只要遍歷出指定目錄下的影象檔案或者所有的xml檔案。為滿足上面的要求,我們重寫程式碼,並且把程式碼封裝到一個函式裡。該函式能過濾掉"."和".."和目錄,並根具引數返回指定的副檔名的檔案。
以上函式,可以獲得指定目錄下指定型別的檔案。如果我們想獲得mypics下的所有jpeg和png的檔案的話呼叫該函式:
$temp = getFileFrom("./mypics",array('jpeg','png'));
目錄樹的遞迴遍歷
我想在php中最實用的遞迴函式就是對目錄的遞迴遍歷了,下面的函式可以獲得指定目錄的完整結構。同時用scandir代替了opendir來簡化程式碼。
神奇的glob
glob是php4.3.0後加入的十分強大的函式,可惜官方手冊上的介紹並不詳細。該函式定義如下:
array glob ( string $pattern [, int $flags = 0 ] )
glob有兩個引數 $pattern 與 可選的 $flag。 $pattern 在字面是模板而不是單純的指定目錄的字串, $flag
通過實踐來學習他的用法。我們的code1是用來遍歷一個目錄下所有檔案的程式碼,如果用glob寫的話可以這樣。
我 們可以看到區別,首先glob要簡單的多,其次glob的第一個引數,"d:/wamp/*"告訴glob要查詢的檔案是"d:/wamp"目錄下的所有 檔案,由此可見$pattern更像是作業系統的萬用字元。而且返回的內容中已經過濾掉了'.'和'..',如果我們要找到所有的bmp檔案只要把引數寫 成"d:/wamp/*.bmp"就可以了,這下子簡單多了。舉個常見的例子,比如我們的網站下有個資料夾叫wallpaper,下面的每個目錄是 wallpaper的分類,而每一個分類下又包含兩目錄,origin(正常大小的),和thumb(縮圖),我們需要一段程式碼來讀取所有分類的所有縮 略圖,如果不是用glob將是很麻煩的一段程式碼,用glob的話,程式碼就是下面的樣子了:
foreach(glob("wallpaper/*/thumb/*") as $fileName){
ehco $fileName;
}
glob第二個引數的含義:
GLOB_MARK 為每一個目錄新增一個反斜槓
GLOB_NOSORT 結果不經過排序
GLOB_NOCHECK 如果沒有匹配的結果,則返回模板本身
GLOB_NOSPACE Backslashes do not quote metacharacters
GLOB_BRACE {a,b,c}分解為a,b,c並分別匹配(重要)
GLOB_ONLYDIR 僅返回目錄
GLOB_ERR Stop on read errors (like unreadable directories), by default errors are ignored.
如果我們要查詢圖片的檔案的話可以這樣寫
foreach(glob("d:/wamp/{*.jpeg,*.jpg,*.gif}", GLOB_BRACE) as $filename){
echo $filename;
}
下面的程式碼是對getFileFrom()函式的改寫,程式碼簡單很多,難點變成了對$exts引數的解析。
轉載於:https://my.oschina.net/lht007/blog/125301