【PHP】 ディレクトリ内のファイル一覧を取得する(再回帰)

指定フォルダ以下にある全ファイルのリストを取得する関数を紹介します。

基本系

<?php
$path = "../blog";
$file_list = getFileList($path);	//blogフォルダ以下の全ファイルを取得
//filelist.txtに結果を出力
foreach ($file_list as $file) {
	file_put_contents("./filelist.txt", $file.PHP_EOL, FILE_APPEND);
}
//ファイルリスト取得関数(再回帰)
function getFileList($path) {
	$files = glob(rtrim($path, "/")."/*");
	$ret = array();
	foreach($files as $file) {
		if (is_file($file)) {
			$ret[] = $file;
		}
		if (is_dir($file)) {
			$ret = array_merge($ret, getFileList($file));
		}
	}
	return $ret;
}
?>

getFileList関数:ファイル一覧を取得する関数です。

  1. glob関数の引数を {探したいディレクトリ}/* にすることでフォルダを含め直下の項目をすべて取得しています。
  2. is_file関数及び、is_dir関数でファイルとフォルダを切り分けます。
  3. fileの場合、返値の配列にパスを格納します。
  4. フォルダの場合、再回帰して結果をarray_merge関数で返値の配列にマージしています。

結果です

../blog/index.php
../blog/license.txt
../blog/readme.html
../blog/wp-activate.php
../blog/wp-admin/about.php
../blog/wp-admin/admin-ajax.php
../blog/wp-admin/admin-footer.php
../blog/wp-admin/admin-functions.php
../blog/wp-admin/admin-header.php
../blog/wp-admin/admin-post.php
../blog/wp-admin/admin.php
../blog/wp-admin/async-upload.php
../blog/wp-admin/authorize-application.php
../blog/wp-admin/comment.php
../blog/wp-admin/credits.php
../blog/wp-admin/css/about-rtl.css
../blog/wp-admin/css/about-rtl.min.css
../blog/wp-admin/css/about.css
../blog/wp-admin/css/about.min.css
以下省略

このようにblogフォルダ以下の全ファイルが出力されていることが確認できました。

拡張子の条件を追加

上記の基本的な関数の第二引数に拡張子の条件を追加してみました。
第二引数は何も指定しなければ、全種類のファイルを取ってくることになっています。
下記の例ではphpファイルのみ取得しています。

<?php
ini_set('display_errors', "On");
$path = "../blog";
$file_list = getFileList($path, "php");	//phpファイルのみ取得
foreach ($file_list as $file) {
	file_put_contents("./filelist.txt", $file.PHP_EOL, FILE_APPEND);
}
//ファイルリスト取得関数(再回帰)
function getFileList($path, $extension = "") {
	$files = glob(rtrim($path, "/")."/*");
	$ret = array();
	foreach($files as $file) {
		if (is_file($file)) {
			if ($extension!="") {
				$file_info = pathinfo($file);
				if (isset($file_info["extension"])) {
					if ($extension==$file_info["extension"]) {
						$ret[] = $file;
					}
				}
			} else {
				$ret[] = $file;
			}
		}
		if (is_dir($file)) {
			$ret = array_merge($ret, getFileList($file, $extension));
		}
	}
	return $ret;
}
?>

引数$extensionが指定された場合、pathinfo関数を利用して該当ファイルの拡張子を取得して、取得したい種類のファイルの場合のみ返値の配列に格納するようにしました。

注意点として、拡張子の無いファイルに対して、pathinfo関数を用いて情報を取得した場合、返値の配列に「extension」インデックスが存在しないようです。それでここでは、isset($file_info[“extension”])として拡張子の無いファイルかどうかを判定しています。

結果です

../blog/index.php
../blog/wp-activate.php
../blog/wp-admin/about.php
../blog/wp-admin/admin-ajax.php
../blog/wp-admin/admin-footer.php
../blog/wp-admin/admin-functions.php
../blog/wp-admin/admin-header.php
../blog/wp-admin/admin-post.php
../blog/wp-admin/admin.php
../blog/wp-admin/async-upload.php
../blog/wp-admin/authorize-application.php
../blog/wp-admin/comment.php
../blog/wp-admin/credits.php
../blog/wp-admin/custom-background.php
../blog/wp-admin/custom-header.php
../blog/wp-admin/customize.php
../blog/wp-admin/edit-comments.php
../blog/wp-admin/edit-form-advanced.php
../blog/wp-admin/edit-form-blocks.php
以下省略

phpファイルのみ出力されていることが確認できました。

Share this content: