dir()、readdir()、scandir()和glob()四種遍歷目錄方法及性能分析
目錄
- 一、使用dir()函數遍歷目錄
- 二、使用opendir()、readdir()函數遍歷目錄
- 三、使用glob()函數遍歷目錄
- 四、使用php scandir函數遍歷目錄和所有文件
- 五、測試以上四種方法的性能并分析結果
php遍歷目錄和文件的場景在很多時候都能用到,遍歷目錄方法的方法有好幾種,那么應該使用哪種方法呢?一般情況下,遍歷目錄時只需遍歷出目錄和文件,如果要遍歷子目錄下目錄和文件,就需要用到is_dir()判斷是否問目錄,若是目錄則遞歸遍歷。php中遍歷目錄用到的函數有dir()、readdir()、scandir()和glob(),那么四個函數有什么區別呢?性能又如何呢?
一、使用dir()函數遍歷目錄
dir()函數是以對象的方式訪問目錄,如果成功,返回一個 Directory 類實例,參數錯誤的情況下返回 NULL , 其它錯誤情況返回 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()函數遍歷目錄
相關函數
函數opendir()用于打開指定目錄,接受一個目錄的路徑及目錄名作為參數,函數返回值為可供其他目錄函數使用的目錄句柄(資源類型)。如果該目錄不存在或者沒有訪問權限,則返回FALSE。
函數readdir()用于讀取指定目錄,接受已經用opendir()函數打開的可操作目錄句柄作為參數,函數返回當前目錄指針位置的一個文件名,并將目錄指針向后移動一位。當指針位于目錄的結尾時,因為沒有文件存在則返回FALSE。
函數closedir()關閉指定目錄,接受已經用opendir()函數打開的可操作目錄句柄作為參數。函數無返回值,運行后關閉打開的目錄。
函數rewinddir()倒回目錄句柄,接受已經用opendir()函數打開的可操作目錄句柄作為參數。將目錄指針重置目錄到開始處,即倒回目錄的開頭。
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()函數遍歷目錄
glob() 函數返回匹配指定模式的文件名或目錄,該函數返回一個包含有匹配文件 / 目錄的數組,如果出錯返回 false。
代碼
function myglob($path){ foreach(glob($path) as $file){ if($file != "." && $file != ".."){ if(is_dir($file)){ echo "目錄:" . $file . "/"; myglob($file . "/*"); }else{ echo "文件:" . $file . ""; } } } }
其中參數$path 有三種情況:
參數$path=’*.*’,表示掃描當前目錄下的文件,不包括文件夾,返回的是一個數組。
參數$path=’images/*’,表示掃描指定目錄下所有的文件,包括文件夾,也可以掃描指定的文件類型,如:images/*.jpg;注意,如果只輸入:images只會返回該文件夾名稱,如果只輸入:images/ 則什么也不會返回。
參數$path=’*’,表示掃描指定目錄下的所有文件、目錄及子目錄的文件。
四、使用php scandir函數遍歷目錄和所有文件
<?php $dir = "."; //當前目錄 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); //繼續遍歷 } echo "<br/>"; } } ?>
五、測試以上四種方法的性能并分析結果
<?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 次,用時 $total 毫秒;"; } ?>
通過測試可以看出,在單一遍歷時dir()、readdir()函數效率完敗glob()函數;而遞歸遍歷時,glob()函數性能稍微好一點,但優勢不是很高。
dir()函數 Directory 類的實例,而 Directory 類中封裝的read()方法與readdir()函數功能一樣,所以使用dir()和readdir函數遍歷目錄時,性能差別不大。
到此這篇關于dir()、readdir()、scandir()和glob()四種遍歷目錄方法及性能分析的文章就介紹到這了,更多相關dir()、readdir()、scandir()和glob()區別內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!