1. 程式人生 > >使用dir()、readdir()和glob()遍歷目錄及測試效能

使用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(0);
for($i = 1; $i <= 5; $i++){
    $starttime = microtime(true);
    mydir('./');
    //myreaddir('./');
    //myglob('*');
    $endtime = microtime(true);
    $total = ($endtime - $starttime) * 1000;
    echo "第 $i 次,用時 $total 毫秒;";
}
?>

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

       dir()函式 Directory 類的例項,而 Directory 類中封裝的read()方法與readdir()函式功能一樣,所以使用dir()和readdir函式遍歷目錄時,效能差別不大。