dir()、readdir()、scandir()和glob()四種遍歷目錄方法及性能分析
php遍歷目錄和文件的場(chǎng)景在很多時(shí)候都能用到,遍歷目錄方法的方法有好幾種,那么應(yīng)該使用哪種方法呢?一般情況下,遍歷目錄時(shí)只需遍歷出目錄和文件,如果要遍歷子目錄下目錄和文件,就需要用到is_dir()判斷是否問(wèn)目錄,若是目錄則遞歸遍歷。php中遍歷目錄用到的函數(shù)有dir()、readdir()、scandir()和glob(),那么四個(gè)函數(shù)有什么區(qū)別呢?性能又如何呢?
一、使用dir()函數(shù)遍歷目錄
dir()函數(shù)是以對(duì)象的方式訪問(wèn)目錄,如果成功,返回一個(gè) Directory 類(lèi)實(shí)例,參數(shù)錯(cuò)誤的情況下返回 NULL , 其它錯(cuò)誤情況返回 false。
代碼
function mydir($path){ $dir = dir($path); while(false !== ($file = $dir -> read())){ if($file != '.' && $file != '..'){ if(is_dir($path . $file)){ echo '目錄:' . $path . $file . '<br/>'; mydir($path . $file . '/'); }else{ echo '文件:' . $path . $file . '<br/>'; } } } $dir -> close(); }
二、使用opendir()、readdir()函數(shù)遍歷目錄
相關(guān)函數(shù)
函數(shù)opendir()用于打開(kāi)指定目錄,接受一個(gè)目錄的路徑及目錄名作為參數(shù),函數(shù)返回值為可供其他目錄函數(shù)使用的目錄句柄(資源類(lèi)型)。如果該目錄不存在或者沒(méi)有訪問(wèn)權(quán)限,則返回FALSE。
函數(shù)readdir()用于讀取指定目錄,接受已經(jīng)用opendir()函數(shù)打開(kāi)的可操作目錄句柄作為參數(shù),函數(shù)返回當(dāng)前目錄指針位置的一個(gè)文件名,并將目錄指針向后移動(dòng)一位。當(dāng)指針位于目錄的結(jié)尾時(shí),因?yàn)闆](méi)有文件存在則返回FALSE。
函數(shù)closedir()關(guān)閉指定目錄,接受已經(jīng)用opendir()函數(shù)打開(kāi)的可操作目錄句柄作為參數(shù)。函數(shù)無(wú)返回值,運(yùn)行后關(guān)閉打開(kāi)的目錄。
函數(shù)rewinddir()倒回目錄句柄,接受已經(jīng)用opendir()函數(shù)打開(kāi)的可操作目錄句柄作為參數(shù)。將目錄指針重置目錄到開(kāi)始處,即倒回目錄的開(kāi)頭。
function myreaddir($path){ $handle = opendir($path); if($handle){ while (false !== ($file = readdir($handle))) { if($file != '.' && $file != '..'){ if(is_dir($path.$file)){ echo '目錄:' . $path . $file . '<br/>'; myreaddir($path . $file . '/'); }else{ echo '文件:' . $path . $file . '<br/>'; } } } closedir($handle); return false; } }
三、使用glob()函數(shù)遍歷目錄
glob() 函數(shù)返回匹配指定模式的文件名或目錄,該函數(shù)返回一個(gè)包含有匹配文件 / 目錄的數(shù)組,如果出錯(cuò)返回 false。
代碼
function myglob($path){ foreach(glob($path) as $file){ if($file != '.' && $file != '..'){ if(is_dir($file)){ echo '目錄:' . $file . '/'; myglob($file . '/*'); }else{ echo '文件:' . $file . ''; } } } }
其中參數(shù)$path 有三種情況:
參數(shù)$path=’*.*’,表示掃描當(dāng)前目錄下的文件,不包括文件夾,返回的是一個(gè)數(shù)組。
參數(shù)$path=’images/*’,表示掃描指定目錄下所有的文件,包括文件夾,也可以掃描指定的文件類(lèi)型,如:images/*.jpg;注意,如果只輸入:images只會(huì)返回該文件夾名稱(chēng),如果只輸入:images/ 則什么也不會(huì)返回。
參數(shù)$path=’*’,表示掃描指定目錄下的所有文件、目錄及子目錄的文件。
四、使用php scandir函數(shù)遍歷目錄和所有文件
<?php $dir = "."; //當(dāng)前目錄 list_file($dir); function list_file($dir){ $list = scandir($dir); // 得到該文件下的所有文件和文件夾 foreach($list as $file){//遍歷 $file_location=$dir."/".$file;//生成路徑 if(is_dir($file_location) && $file!="." &&$file!=".."){ //判斷是不是文件夾 echo "------------------------sign in $file_location------------------"; list_file($file_location); //繼續(xù)遍歷 } echo "<br/>"; } } ?>
五、測(cè)試以上四種方法的性能并分析結(jié)果
<?php set_time_limit(0); for($i = 1; $i <= 5; $i++){ $starttime = microtime(true); mydir('./'); //scandir('./'); //myreaddir('./'); //myglob('*'); $endtime = microtime(true); $total = ($endtime - $starttime) * 1000; echo "第 $i 次,用時(shí) $total 毫秒;"; } ?>
通過(guò)測(cè)試可以看出,在單一遍歷時(shí)dir()、readdir()函數(shù)效率完敗glob()函數(shù);而遞歸遍歷時(shí),glob()函數(shù)性能稍微好一點(diǎn),但優(yōu)勢(shì)不是很高。
dir()函數(shù) Directory 類(lèi)的實(shí)例,而 Directory 類(lèi)中封裝的read()方法與readdir()函數(shù)功能一樣,所以使用dir()和readdir函數(shù)遍歷目錄時(shí),性能差別不大。
到此這篇關(guān)于dir()、readdir()、scandir()和glob()四種遍歷目錄方法及性能分析的文章就介紹到這了,更多相關(guān)dir()、readdir()、scandir()和glob()區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)適配器模式
這篇文章主要介紹了php設(shè)計(jì)模式中的適配器模式,使用php實(shí)現(xiàn)適配器模式,感興趣的小伙伴們可以參考一下2015-12-12PHP時(shí)間類(lèi)完整實(shí)例(非常實(shí)用)
這篇文章主要介紹了PHP時(shí)間類(lèi)完整實(shí)例,涉及PHP針對(duì)日期、時(shí)間、星期等的獲取與比較等操作技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-12-12PHP 自定義錯(cuò)誤處理函數(shù)trigger_error()
trigger_error() 用于在用戶指定的條件下觸發(fā)一個(gè)錯(cuò)誤消息。它與內(nèi)建的錯(cuò)誤處理器一同使用,也可以與由 set_error_handler() 函數(shù)創(chuàng)建的用戶自定義函數(shù)使用2013-03-03PHP中include/require/include_once/require_once使用心得
include() 、require()語(yǔ)句包含并運(yùn)行指定文件。這兩結(jié)構(gòu)在包含文件上完全一樣,唯一的區(qū)別是對(duì)于錯(cuò)誤的處理。require()語(yǔ)句在遇到包含文件不存在,或是出錯(cuò)的時(shí)候,就停止即行,并報(bào)錯(cuò)。include()則繼續(xù)即行。2016-08-08Linux環(huán)境下php實(shí)現(xiàn)給網(wǎng)站截圖的方法
這篇文章主要介紹了Linux環(huán)境下php實(shí)現(xiàn)給網(wǎng)站截圖的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Linux環(huán)境下php實(shí)現(xiàn)網(wǎng)站截圖的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2016-05-05PHP獲取一年中每個(gè)星期的開(kāi)始和結(jié)束日期的方法
這篇文章主要介紹了PHP獲取一年中每個(gè)星期的開(kāi)始和結(jié)束日期的方法,涉及php對(duì)日期操作的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02