Recursively PHP ile dosya sayım

5 Cevap php

Bir newbi ve benim Google-Fu için basit bir soru beni başarısız oluyor. PHP kullanarak, nasıl (onlar olabilir ve herhangi bir alt-dizinleri, vb) herhangi bir alt dizinleri dahil olmak üzere, belirli bir dizindeki dosyaların sayısını sayabilirsiniz? örneğin dizin yapısı bu gibi görünüyor eğer:

/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

Script ". / Dir_A" için '5 'ile dönmelidir.

Ben birlikte aşağıdaki kaldırımlı ettik ama oldukça doğru cevabı dönen değil, ve ben neden emin değilim:

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;  
    			echo $filecount; /* debugging */
    			echo " $total"; /* debugging */
    			echo " $path/$file
"; /* debugging */ getFilecount( "$path/$file", $filecount, $total); } } } return $total; }

Ben büyük ölçüde herhangi bir yardım takdir ediyorum.

5 Cevap

Bu hile yapmak gerekir:

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;
}

Eğer hala bir hata alırsanız SPL kullanın, sonra bakın.

RecursiveDirectoryIterator

Kullanımı örnek:

<?php

$path = realpath('/etc');

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

?>

Bu ($ yol ifself dahil) $ yolunun altındaki tüm dosyaları ve dizinleri bir listesini yazdırır. Dizinleri atlamak istiyorsanız, RecursiveIteratorIterator :: SELF_FIRST parçası kaldırmak.

Sonra sadece isDir kullanın ()

Neden $ filecount geçiyoruz? [Geçti-in] değeri kullanılır varlık değildir; sadece kullanım "$ toplam + = $ filecount" olduğu ve sadece bunu önce $ filecount basan ediyoruz.

Fonksiyonu normal (non-dir) dosyası karşılaştığında Sen davayı kaçırıyorsun.

Düzenleme: Ben sadece) (glob çağrısı fark ettim. Bu gerekli değil. Sizin işlevi özyinelemeli zaten, bütün dizin ağacındaki her dosyayı dokunuyor. Paolo Bergantino cevabı @ bakın.

Paolo Bergantino kendi kodu ile hemen hemen, ama o bunu yanlış beri fonksiyonu hala. DS_Store dosyaları sayacaktır. Aşağıda Doğru Kod

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;
}

glob() fonksiyonu PHP manuel kontrol edin: http://php.net/glob

Bu özyinelemeli yapmak için nasıl gibi yorumlarda örnekler vardır.