天天看點

使用dir()、readdir()和glob()周遊目錄及測試性能

       一般情況下,周遊目錄時隻需周遊出子目錄和檔案,不需要周遊出子目錄下的目錄和檔案,如果要周遊子目錄下目錄和檔案,就需要用到is_dir()判斷是否問目錄,若是目錄則遞歸周遊。php中周遊目錄用到的函數有dir()、readdir()、glob(),那麼三個函數有什麼差別呢?性能又如何呢?

一、使用dir()函數周遊目錄

  1. dir()函數是以對象的方式通路目錄,如果成功,傳回一個 Directory 類執行個體,參數錯誤的情況下傳回 NULL , 其它錯誤情況傳回 false。
  2. 代碼
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()函數周遊目錄

  1. 相關函數
    • 函數opendir()用于打開指定目錄,接受一個目錄的路徑及目錄名作為參數,函數傳回值為可供其他目錄函數使用的目錄句柄(資源類型)。如果該目錄不存在或者沒有通路權限,則傳回FALSE。
    • 函數readdir()用于讀取指定目錄,接受已經用opendir()函數打開的可操作目錄句柄作為參數,函數傳回目前目錄指針位置的一個檔案名,并将目錄指針向後移動一位。當指針位于目錄的結尾時,因為沒有檔案存在則傳回FALSE。
    • 函數closedir()關閉指定目錄,接受已經用opendir()函數打開的可操作目錄句柄作為參數。函數無傳回值,運作後關閉打開的目錄。
    • 函數rewinddir()倒回目錄句柄,接受已經用opendir()函數打開的可操作目錄句柄作為參數。将目錄指針重置目錄到開始處,即倒回目錄的開頭。
  2. 代碼
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()函數周遊目錄

  1. glob() 函數傳回比對指定模式的檔案名或目錄,該函數傳回一個包含有比對檔案 / 目錄的數組,如果出錯傳回 false。
  2. 代碼
function myglob($path){
    foreach(glob($path) as $file){
        if($file != '.' && $file != '..'){
            if(is_dir($file)){
                echo '目錄:' . $file . '/<br/>';
                myglob($file . '/*');
            }else{
                echo '檔案:' . $file . '<br/>';
                }
            }
        }
    }
           

其中參數$path 有三種情況:

  • 參數$path=’*.*’,表示掃描目前目錄下的檔案,不包括檔案夾,傳回的是一個數組。
  • 參數$path=’images/*’,表示掃描指定目錄下所有的檔案,包括檔案夾,也可以掃描指定的檔案類型,如:images/*.jpg;注意,如果隻輸入:images隻會傳回該檔案夾名稱,如果隻輸入:images/ 則什麼也不會傳回。
  • 參數$path=’*’,表示掃描指定目錄下的所有檔案、目錄及子目錄的檔案。

    四、測試以上三種方法的性能并分析結果

<?php
set_time_limit();
for($i = ; $i <= ; $i++){
    $starttime = microtime(true);
    mydir('./');
    //myreaddir('./');
    //myglob('*');
    $endtime = microtime(true);
    $total = ($endtime - $starttime) * ;
    echo "第 $i 次,用時 $total 毫秒;";
}
?>
           

       通過測試可以看出,在單一周遊時dir()、readdir()函數效率完敗glob()函數;而遞歸周遊時,glob()函數性能稍微好一點,但優勢不是很高。

       dir()函數 Directory 類的執行個體,而 Directory 類中封裝的read()方法與readdir()函數功能一樣,是以使用dir()和readdir函數周遊目錄時,性能差别不大。