PHPでファイル数とディレクトリ数を求める方法(追記あり)

 

PHPでディレクトリ内のファイル数とディレクトリ数を求める方法を紹介します。
インターネット上を探してみても、有効な情報は見つかりませんでした。
外部コマンド使うことも考えましたが、Windowsサーバーなどでは使用できないので避けました。
なので今回は、若干ゴリ押しですがPHPのみ実装してみようと思います。

[2012年12月16日]追記あり

さて、今回使用する関数は以下のとおりです。

is_file()
その名前のモノがファイルかどうかを調べます。
ファイルであればTLUE、ファイルのなければFALSEを返却します

count()
要素の数を返します。
今回は配列の要素数を数えるために使用します。

scandir()
指定したディレクトリ内のファイル・ディレクトリを配列に格納します。

foreach()
ループ処理の一つです。
詳しい説明は省きますが、主に配列を反復処理させるのに使用します。
詳しくはPHPマニュアルへ。

単純にディレクトリとファイルの総数を求める場合は簡単です。

[php]

[/php]

$pathという変数には探索するディレクトリのパスを入れます。
scandir()で$pathにて指定したディレクトリの中身を$dirに配列として格納します。
最後にcount()で要素数を出せば終わりです。
配列には「./」と「../」も格納されるため-2をして除外します。

この方法では、ファイル・ディレクトリの総数を数えることができます。
ファイル・ディレクトリのみが存在するフォルダであれば、かなり有効な手段でしょう。

そこでis_file()を使用することで、ファイル・ディレクトリいずれかを数えることができます。

[php]

[/php]

$pathで指定したディレクトリ内に存在するファイルの数を出力します。
scandir()までは同じです。
その後、foreach()で要素数を全て回します。
foreach()ブロック内のif文ではis_file()を用いて、ファイルか否かの判定をしています。
is_file()は、ファイルであれば、true。ファイルでない、つまりディレクトリはfalseとなります。
ここでは、trueなのでファイルであれば、その後の文でインクリメントしていきます。
最後にecho()でカウントした変数の表示で終了です。

次にディレクトリのカウント。

[php]

[/php]

基本は変わらず、is_file()の比較先の真偽値を入れ替えただけですね。
is_file()でfalseにすることでディレクトリの判定が可能になります。
「./」と「../」もディレクトリ扱いとなるので、-2で除外するのも忘れずに。

こんな感じで簡単に実装できました。
最初は関数が存在するのだと思っていましたが、どうやら存在しないようです。
今回の方法はゴリ押しで、サーバーへの負荷などは考慮していません。
とにかく値さえ帰ってくることだけを考えています。

ディレクトリの数などを求める場などあまり無いように思いますが、僕が必要だったんです。
今、作成している写真公開のウェブアプリケーションですね。
ディレクトリにまとめたアルバムを自動表示するにはどうすればいいかと。
普通にPHPでループ処理させればいいのですが、何回ループすればいいかはディレクトリであったり、ファイルであったりの数を求めなければなりません。
そこで、検索してみるとうまい方法が見つかりませんでした。
この方法は風呂に入ってる時に思いつきました。気分転換って大事。

ま、少しでも参考になれば幸いです。

あと、もっといい方法を知っている方がいましたら、教えて頂けると嬉しいです。


以下追記。(2012年12月16日)
Orisanoさん(友人)よりコメント欄にて上記コードの”無駄”をご指摘頂きました。
上記コード内でループ変数として使用している$iですが、必要ありません。
無駄なので確保しないほうが良いです。

あと、プラグインのSyntax Highlightのバージョンの関係で、コードのタブが使えなくなってるみたいです。
見づらいので、今度修正しておきます。

以下、Orisanoさんより修正頂いたコードです。動作確認もしましたので大丈夫だと思います。
[php]

[/php]
Orisanoさん、ありがとうございました。

Comments

  1. 少し疑問に思ったのですが、

    foreachを使えばループ変数の$iはいらないのでは無いかと感じました。

  2. 失礼しました。先ほどのコメントは直接phpタグを埋め込んだせいで
    見えなくなっていました。

    function count_file($path){
    $files = scanfdir($path);
    $count = 0;
    foreach ($files as $file){
    if (is_file($path . $file) == true){
    $count++;
    }
    }
    return ($count);
    }

    • Orisanoさん、コメントありがとうございます。
      Orisanoさんの言うとおり、$iは必要無いです。
      メモリ領域的にも無駄に変数確保しないほうが良いです。

      書いていただいたコードはちゃんと動作しました。
      (scanfdir()ではなく、scandir()ですが)

      あとで、この記事にも追記しておきますねー。

コメントを残す

Your email address will not be published / Required fields are marked *