1.使用scandir 函數
1.1 函數封裝
scandir : 是php 自帶函數,返回當前目錄下的所有文件和文件夾。注意:會有 ‘.’ 和’..’,分別代編當前目錄和上層目錄。
/** * 使用scandir 遍歷目錄 * * @param $path * @return array */ function getDir($path) { //判斷目錄是否為空 if(!file_exists($path)) { return []; } $files = scandir($path); $fileItem = []; foreach($files as $v) { $newPath = $path .DIRECTORY_SEPARATOR . $v; if(is_dir($newPath) && $v != '.' && $v != '..') { $fileItem = array_merge($fileItem, getDir($newPath)); }else if(is_file($newPath)){ $fileItem[] = $newPath; } } return $fileItem; }
1.2程序調用:
echo('遍歷目錄開始'); $path = realpath('./m1/'); var_dump(getDir($path)); echo('遍歷目錄結束');
1.3 顯示結果
/usr/local/opt/php@5.6/bin/php 遍歷目錄開始array(9) { [0]=> string(48) “/Users/niedewang/PhpstormProjects/test/m1/1.html” [1]=> string(48) “/Users/niedewang/PhpstormProjects/test/m1/2.html” [2]=> string(50) “/Users/niedewang/PhpstormProjects/test/m1/demo.txt” [3]=> string(54) “/Users/niedewang/PhpstormProjects/test/m1/m2/m2_1.html” [4]=> string(54) “/Users/niedewang/PhpstormProjects/test/m1/m2/m2_2.html” [5]=> string(54) “/Users/niedewang/PhpstormProjects/test/m1/m2/m2_3.html” [6]=> string(57) “/Users/niedewang/PhpstormProjects/test/m1/m2/m3/m3_1.html” [7]=> string(56) “/Users/niedewang/PhpstormProjects/test/m1/m2/m3/m3_2.php” [8]=> string(56) “/Users/niedewang/PhpstormProjects/test/m1/m2/m3/m3_3.txt” } 遍歷目錄結束 Process finished with exit code 0
1.4 注意事項
- 難度系數:簡單
- 注意事項: 注意循環的時候,過濾 ‘.’ 和 ‘..’ ,否則可能會導致死循環
二:使用glob函數
2.1 函數封裝
glob:是php 子系統自帶函數,功能和scandir 類似,但比它更加強大靈活。
比如 :glob(‘*.txt’),將會列舉出目錄下的所有為站名為.txt 的文件。
/** * 使用glob 遍歷 * @param $path */ function getDir2($path) { //判斷目錄是否為空 if(!file_exists($path)) { return []; } $fileItem = []; //切換如當前目錄 chdir($path); foreach(glob('*') as $v) { $newPath = $path . DIRECTORY_SEPARATOR . $v; if(is_dir($newPath)) { $fileItem = array_merge($fileItem,getDir2($newPath)); }else if(is_file($newPath)) { $fileItem[] = $newPath; } } return $fileItem; }
2.2 函數調用方式
echo('遍歷目錄開始'); $path = realpath('./m1/'); var_dump(getDir2($path)); echo('遍歷目錄結束');
2.3 :顯示結果,同1.3 一致,不再展示
2.4 注意事項
- 難易程度:非常容易,不需要過濾 . 和 ..
- 靈活程度:非常靈活
三:使用opendir 函數
3.1 函數封裝
opendir : 返回一個目錄句柄,可以使用readdir 讀取這個目錄,也可以通過closedir 關閉這個目錄
/** * 使用opendir 函數遞歸 */ function getDir3($path) { if(!file_exists($path)) { return []; } $handle = opendir($path); $fileItem = []; if($handle) { while(($file = readdir($handle)) !== false) { $newPath = $path . DIRECTORY_SEPARATOR . $file; if(is_dir($newPath) && $file != '.' && $file != '..') { $fileItem = array_merge($fileItem,getDir3($newPath)); }else if(is_file($newPath)) { $fileItem[] = $newPath; } } } @closedir($handle); return$fileItem; }
3.2 調用方式
echo('遍歷目錄開始'); $path = realpath('./m1/'); var_dump(getDir5($path)); echo('遍歷目錄結束');
3.3 注意事項
需要過濾 "." 和 ".."
四:使用dir 函數
4.1 和opendir 函數非常類似,它更加的面向對象。
/** * dir 函數的方式,對象 * * @param $path * @return array */ function getDir4($path) { if(!file_exists($path)) { return []; } $handel = dir($path); $fileItem = []; if($handel) { while(($file = $handel->read()) !== false) { $newPath = $path . DIRECTORY_SEPARATOR . $file; if(is_dir($newPath) && $file != '.' && $file != '..') { $fileItem = array_merge($fileItem,getDir4($newPath)); }else if(is_file($newPath)) { $fileItem[] = $newPath; } } } $handel->close(); return $fileItem; }
4.2 調用方式
echo('遍歷目錄開始'); $path = realpath('./m1/'); var_dump(getDir4($path)); echo('遍歷目錄結束');
4.3 注意事項
需要過濾 "." 和 ".."