下面的實例是簡單的實現目錄大小,其中用到了比較常見的遞歸函數
<?php
function dirSize($directory){ //自定義一個函數dirSize(),統計傳入參數的目錄的大小
$dir_size=0; //初始化
if($dir_handle=opendir($directory)){ //判斷目錄是否能夠成功打開
while ($filename=readdir($dir_handle)){ //循環遍歷目錄下的所有文件
if($filename!="." && $filename !=".."){ //排除兩個特殊的目錄
$subFile=$directory."/".$filename; //將目錄下的子文件和當前目錄相連
if(is_dir($subFile)) //判斷文件名是不是一個目錄
$dir_size+=dirSize($subFile); //遞歸的調用自身函數,求子目錄的大小
if(is_file($subFile)) //判斷文件名是不是一個文件
$dir_size+=filesize($subFile); //求出文件的大小並累加
}
}
closedir($dir_handle); //逐級關閉文件資源
return $dir_size; //返回計算後的目錄的大小
}
}
$dir_size=dirSize("phpMyAdmin"); //傳參數,輸入目錄地址
echo round($dir_size/pow(1024,1),2)."KB"; //以KB輸出目錄的大小
?>
遞歸函數的實現過程:
假如目錄dir下有dir1、1.txt、2.txt,目錄dir1下有文件3.txt、4.txt。
當dir參數傳入到函數時,函數判斷dir目錄下是否含有目錄,如果有,就進入其目錄下。首先,dir1是個目錄,函數判斷dir1是目錄,並將指針指向下一個文件,下一個文件是1.txt。然後函數就會返回並將dir1參數傳入到函數,函數再判斷dir1下是否有目錄,顯然dir1文件下沒有目錄,只有文件3.txt和4.txt。函數開始循環遍歷dir1目錄下所有文件並累加文件的大小。當指針指向4.txt下一個時,因爲沒有,程序不再循環並執行closedir()關閉資源,及關閉了dir1目錄的資源。由於整個dir還沒有運行完,函數執行完dir1下的目錄並關閉資源後開始運行當初指針指向的下一個文件1.txt。然後是2.txt。當指針指向2.txt下一個時,沒有文件,函數循環結束。關閉dir目錄資源。當整個目錄就運行完了,函數及通過累加的方法獲得了所有文件的大小(整個目錄的大小)。這樣就實現了整個遞歸函數的調用。