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