10

初心者のための簡単な質問で、私の Google-Fu は失敗しています。PHP を使用して、特定のディレクトリ内のファイルの数を、サブディレクトリ (およびそれらが持つ可能性のあるサブディレクトリなど) を含めてどのように数えることができますか? たとえば、ディレクトリ構造が次のようになっている場合:

/Dir_A/  
/Dir_A/File1.blah  
/Dir_A/Dir_B/  
/Dir_A/Dir_B/File2.blah  
/Dir_A/Dir_B/File3.blah  
/Dir_A/Dir_B/Dir_C/  
/Dir_A/Dir_B/Dir_C/File4.blah  
/Dir_A/Dir_D/  
/Dir_A/Dir_D/File5.blah

スクリプトは、「./Dir_A」に対して「5」を返す必要があります。

私は次のことをまとめましたが、正しい答えを返していません。その理由はわかりません:

function getFilecount( $path = '.', $filecount = 0, $total = 0 ){  
    $ignore = array( 'cgi-bin', '.', '..', '.DS_Store' );  
    $dh = @opendir( $path );  
    while( false !== ( $file = readdir( $dh ) ) ){  
        if( !in_array( $file, $ignore ) ){  
            if( is_dir( "$path/$file" ) ){  
                $filecount = count(glob( "$path/$file/" . "*"));  
                $total += $filecount;  
                エコー $filecount; /* デバッグ */
                echo "$total"; /* デバッグ */
                echo " $path/$file 
"; /* デバッグ */ getFilecount( "$path/$file", $filecount, $total); } } } $合計を返します。 }

助けていただければ幸いです。

4

6 に答える 6

21

これでうまくいくはずです:

function getFileCount($path) {
    $size = 0;
    $ignore = array('.','..','cgi-bin','.DS_Store');
    $files = scandir($path);
    foreach($files as $t) {
        if(in_array($t, $ignore)) continue;
        if (is_dir(rtrim($path, '/') . '/' . $t)) {
            $size += getFileCount(rtrim($path, '/') . '/' . $t);
        } else {
            $size++;
        }   
    }
    return $size;
}
于 2009-03-12T23:57:26.880 に答える
16

SPL を使用して、それでもエラーが発生するかどうかを確認します。

RecursiveDirectoryIterator

使用例:

<?php

$path = realpath('/etc');

$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
foreach($objects as $name => $object){
    echo "$name\n";
}

?>

$path ($path ifself を含む) の下にあるすべてのファイルとディレクトリのリストを出力します。ディレクトリを省略したい場合は、RecursiveIteratorIterator::SELF_FIRST 部分を削除します。

次に、 isDir() を使用します

于 2009-03-12T23:59:51.227 に答える
1

Paolo Bergantino はほとんど彼のコードを使用していましたが、スペルが間違っているため、関数は .DS_Store ファイルをカウントします。以下の正しいコード

function getFileCount($path) {
    $size = 0;
    $ignore = array('.','..','cgi-bin','.DS_Store');
    $files = scandir($path);
    foreach($files as $t) {
        if(in_array($t, $ignore)) continue;
        if (is_dir(rtrim($path, '/') . '/' . $t)) {
            $size += getFileCount(rtrim($path, '/') . '/' . $t);
        } else {
            $size++;
        }   
    }
    return $size;
}
于 2013-04-03T03:06:22.783 に答える
0

なぜ $filecount を渡すのですか? [渡された] 値は使用されていません。唯一の使用法は「$total += $filecount」であり、その直前に $filecount をオーバーライドしています。

関数が通常の (ディレクトリ以外の) ファイルに遭遇した場合を見逃しています。

編集: glob() の呼び出しに気付きました。それは必要はありません。とにかく、関数はディレクトリツリー全体のすべてのファイルに再帰的に触れています。@Paolo Bergantinoの回答を参照してください。

于 2009-03-12T23:56:46.010 に答える
-2

関数に関する PHP マニュアルを確認してくださいglob(): http://php.net/glob

再帰的にする方法については、コメントに例があります。

于 2009-03-13T00:04:09.127 に答える