PHP獲取目錄中的全部內容RecursiveDirectoryIterator
這次我們來介紹一個SPL庫中的目錄迭代器,它的作用其實非常簡單,從名字就可以看出來,就是獲取指定目錄下的所有內容。之前我們要遍歷目錄獲取目錄及目錄下的所有檔案一般是需要進行遞迴遍歷的,自己寫這個程式碼說實話還是挺麻煩的,所以PHP為我們準備好了這一套內建API,當輸入指定的目錄後,直接返回該目錄下所有子目錄及檔案內容。當然,並不是樹型的,順序並不一定,想要組織成樹型還需要我們自己再進行處理。
話不多說,直接看程式碼:
<code > $path = $argv[1]; // 獲取目錄下所有內容 $dirs = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST); foreach($dirs as $k=>$d){ echo 'key:'. $k, PHP_EOL; if($d->isDir()){ echo $d->getPathname(), PHP_EOL; }else{ echo $d->getFilename(), PHP_EOL; } } //執行 php PHP獲取目錄中的全部內容RecursiveDirectoryIterator.php ../ // key:../. // ../. // key:../.. // ../.. // key:../source // ../source // key:../source/. // ../source/. // key:../source/.. // ../source/.. // key:../source/PHP獲取目錄中的全部內容RecursiveDirectoryIterator.php // PHP獲取目錄中的全部內容RecursiveDirectoryIterator.php // key:../source/PHP大檔案讀取操作.php // PHP大檔案讀取操作.php // key:../PHP大檔案讀取操作.md // PHP大檔案讀取操作.md // key:../PHP獲取目錄中的全部內容RecursiveDirectoryIterator.md // PHP獲取目錄中的全部內容RecursiveDirectoryIterator.md </code>
其實就一行程式碼,然後直接迴圈輸出這個迭代器。從結果中我們可以看出,先進入 source 目錄遍歷完成後再遍歷外部的檔案內容,按照目錄、檔名的順序依次獲取了目錄下的所有內容。是不是比我們自己寫遞迴函式要方便很多。
如果我們想獲取目錄下的所有PHP檔案,並且計算他們的檔案總大小呢?使用這一套迭代器操作也可以非常簡單的完成,我們只需要增加一個正則迭代器對前面的迭代器內容進行一下過濾就好了:
<code > // 獲取所有php檔案 $regIts = new RegexIterator($dirs, '/^.+\.php$/i'); $fileSize = 0; foreach($regIts as $k=>$p){ echo $p->getSize() . ' ' . $k, PHP_EOL; $fileSize += $p->getSize(); } echo 'Total ', $fileSize, PHP_EOL; // 622 ../source/PHP獲取目錄中的全部內容RecursiveDirectoryIterator.php // 869 ../source/PHP大檔案讀取操作.php // Total 1491 </code>
感覺就和 ls -l 一樣,可以方便的讓我們能夠進行目錄下的相關操作。這個類的使用就簡單的介紹到這裡,關於SPL庫中還有許多值得我們探索的能力,慢慢學習慢慢實踐,不斷提升我們面向優雅程式設計的能力。
測試程式碼:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202003/source/PHP%E8%8E%B7%E5%8F%96%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E5%85%A8%E9%83%A8%E5%86%85%E5%AE%B9RecursiveDirectoryIterator.php
參考文件:
《PHP7程式設計實戰》
https://www.php.net/manual/en/class.recursivedirectoryiterator.php
https://www.php.net/manual/en/class.splfileinfo.php