無料/デスクトップ壁紙/PSP壁紙/携帯待ち受け/写真素材/PHPスクリプト

Web > PHP > ディレクトリ内のファイルの一覧表示

dir を使う

最終更新日とファイルタイプも表示しています
日本語のファイルを扱うため、ファイル名はきちんとエンコードします。

test のディレクトリの中身
	|- image(ディレクトリ)
	|- template(ディレクトリ)
	|- dir.php(ファイル)
	|- dir - あいうえお.php(ファイル)
	|- dir - 日本語.php(ファイル)
// 読み込むディレクトリ名
$readDir = "./test";

// ディレクトリオープン
$dir = dir($readDir);

// パス
$path = $dir->path."/";

// 初期化
$row = 0;
$file = array();	// ファイル名・ディレクトリ名が入る
$date = array();	// 最終更新日が入る
$type = array();	// ファイルタイプが入る

while (($temp = $dir->read()) !== false) {
	// "." と ".." 以外を変数に格納
	if ($temp != "." && $temp != "..") {
		// ファイル名
		$file[$row] = mb_convert_encoding($temp, "UTF-8", "SJIS, EUC-JP, JIS, ASCII");
		// 最終更新日
		$date[$row] = gmdate("Y/m/d(D) H:i:s", filemtime($path.$temp) + 9 * 3600);
		// ファイルタイプ(ディレクトリとファイル以外は unknown)
		switch (filetype($path.$temp)) {
			case "dir":		$type[$row] = "ディレクトリ";	break;
			case "file":	$type[$row] = "ファイル";		break;
			default:		$type[$row] = "unknown";	break;
		}
		$row++;
	}
}

// ディレクトリクローズ
$dir->close();

// 出力
echo '<table><tbody>';
for ($i = 0; $i < $row; $i++) {
	echo '<tr><td>ファイル名:'.$file[$i].'</td><td>最終更新日:'.$date[$i].' ('.$type[$i].")</td></tr>\n";
}
echo '</tbody></table>';

出力

ファイル名:dir - あいうえお.php最終更新日:2009/11/10(Tue) 23:51:26 (ファイル)
ファイル名:dir - 日本語.php最終更新日:2009/11/10(Tue) 23:51:26 (ファイル)
ファイル名:dir.php最終更新日:2009/11/10(Tue) 23:51:26 (ファイル)
ファイル名:image最終更新日:2009/11/27(Fri) 17:42:22 (ディレクトリ)
ファイル名:template最終更新日:2009/11/27(Fri) 17:42:29 (ディレクトリ)

注意

「ディレクトリ ファイル 一覧 php」などで検索すると解説してるサイトが色々と出てきます。その中でループする部分を

while ($temp = $dir->read()) {

}

のように書かれているサイトがたまにありますが、下のように !==演算子 を使うべきなので注意です。
試しに 0 というディレクトリを作ってみると分かりやすいです。
0 は false と評価されるのでその時点でループを抜け、正常に一覧が表示されません。

while (($temp = $dir->read()) !== false) {

}

また、今回は dir という 疑似オブジェクト指向の機構 を使っていますが
opendir, readdir, closedir も同じようなやり方です。
また、ディレクトリかどうか調べるには is_dir、通常のファイルかどうか調べるには is_file があります。

参考

PHP: dir - Manual
PHP: readdir - Manual

最終更新日 2010/06/03