明滅するプログラマの思索

WEBエンジニアとして勤務している一介の男が、日々気づいたことをまとめるブログです

ディレクトリ内のファイルを一覧表示する

PHPを利用して、サーバ上の特定ディレクトリ内のファイルを一覧表示するスクリプトを書いてみます。

実装条件

ソフトウェア バージョン
PHP 5.6.30
<?php
// 特定ディレクトリを定義
define('DIR', '');

$files = [];
$dir_handle = opendir(\DIR);
while(false !== ($entry = readdir($dir_handle))) {
  if ($entry == "." || $entry == "..") {
    continue;
  }
  if (is_dir(\DIR.$entry)) {
    continue;
  }
  $files[] = $entry;
}
foreach ($files as $file) {
  echo $file . "\n";
}

opendir() 関数を利用してディレクトリハンドルというリソースオブジェクトを取得します。
このディレクトリハンドルを readdir() 関数の引数に渡すと、そのディレクトリ内のディレクトリおよびファイルを1つずつ返してくれます。
それを while() 構文を使用して、1つずつ受け取ります。
今回はファイルを一覧表示するため、is_dir() 関数を使って、引数がディレクトリかどうかを判定して、ファイルなら $files に格納します。

上記では、readdir() 関数が返すファイルの並び順は、ファイルシステムに依存しますので、これを例えばファイルの更新日順にしたい場合は、以下のように書けばOKでしょう。

<?php
// 特定ディレクトリを定義
define('DIR', '');

$files = [];
$dir_handle = opendir(\DIR);
while(false !== ($entry = readdir($dir_handle))) {
  if ($entry == "." || $entry == "..") {
    continue;
  }
  if (is_dir(\DIR.$entry)) {
    continue;
  }
  $files[] = $entry;
}
$sorted_files = [];
foreach ($files as $key => $file) {
  $sorted_files[sprintf("%d%05d",filemtime(\DIR.$file), $key)] = $file;
}
krsort($sorted_files);
foreach ($files as $file) {
  echo $file . "\n";
}

filemtime() 関数は、ファイルの更新日付をUNIXタイムスタンプで返してくれます。
それを利用してソートします。
そのとき、ソートする配列のキーは「UNIXタイムスタンプ+ファイルシステムの順番」とします。
ただの UNIXタイムスタンプをキーにしてしまうと、同じ更新日付のファイルが2つ以上あった場合、上書きしてしまうためです。
ファイルシステムの順番は0パディングの5桁としてありますが、もっと多くのファイルが存在する場合はそこを変更すればよいでしょう(あまり、そういう状況は考えにくいとは思いますが)。