2012-06-05 226 views
5

我需要獲取指定目錄中JPG文件的總數,包括所有它的子目錄。沒有子子目錄。PHP目錄中的子目錄和子目錄函數中的文件總數

結構是這樣的:

 
dir1/ 
2 files 
    subdir 1/ 
     8 files 

DIR1 = 10個文件

 
dir2/ 
    5 files 
    subdir 1/ 
     2 files 
    subdir 2/ 
     8 files 

DIR2 = 15個文件

我有這個功能,這不因爲它只計算最後一個子目錄中的文件,並且總數比實際的a多2倍文件的裝載。 (將輸出80,如果我在最後一個子目錄40個文件)

public function count_files($path) { 
global $file_count; 

$file_count = 0; 
$dir = opendir($path); 

if (!$dir) return -1; 
while ($file = readdir($dir)) : 
    if ($file == '.' || $file == '..') continue; 
    if (is_dir($path . $file)) : 
     $file_count += $this->count_files($path . "/" . $file); 
    else : 
     $file_count++; 
    endif; 
endwhile; 

closedir($dir); 
return $file_count; 
} 

回答

6

對於它的樂趣我一起攪打這樣的:

class FileFinder 
{ 
    private $onFound; 

    private function __construct($path, $onFound, $maxDepth) 
    { 
     // onFound gets called at every file found 
     $this->onFound = $onFound; 
     // start iterating immediately 
     $this->iterate($path, $maxDepth); 
    } 

    private function iterate($path, $maxDepth) 
    { 
     $d = opendir($path); 
     while ($e = readdir($d)) { 
      // skip the special folders 
      if ($e == '.' || $e == '..') { continue; } 
      $absPath = "$path/$e"; 
      if (is_dir($absPath)) { 
       // check $maxDepth first before entering next recursion 
       if ($maxDepth != 0) { 
        // reduce maximum depth for next iteration 
        $this->iterate($absPath, $maxDepth - 1); 
       } 
      } else { 
       // regular file found, call the found handler 
       call_user_func_array($this->onFound, array($absPath)); 
      } 
     } 
     closedir($d); 
    } 

    // helper function to instantiate one finder object 
    // return value is not very important though, because all methods are private 
    public static function find($path, $onFound, $maxDepth = 0) 
    { 
     return new self($path, $onFound, $maxDepth); 
    } 
} 

// start finding files (maximum depth is one folder down) 
$count = $bytes = 0; 
FileFinder::find('.', function($file) use (&$count, &$bytes) { 
    // the closure updates count and bytes so far 
    ++$count; 
    $bytes += filesize($file); 
}, 1); 

echo "Nr files: $count; bytes used: $bytes\n"; 

您傳遞的基本路徑,發現處理器和最大目錄深度(-1禁用)。找到的處理程序是您在外部定義的函數,它將通過與find()函數中給出的路徑相關的路徑名稱。

希望這是有道理的,並幫助您:)

-3

用於每個迴路可以做的伎倆更迅速;-)

我記得,執行opendir從SplFileObject推導類是RecursiveIterator,Traversable,Iterator,SeekableIterator類,因此,如果使用SPL標準PHP庫即使在子目錄中也可以檢索整個圖像計數,則不需要一個while循環。

但是,這是一段時間,我沒有使用PHP,所以我可能犯了一個錯誤。

6

你可以使用RecursiveDirectoryIterator

<?php 
function scan_dir($path){ 
    $ite=new RecursiveDirectoryIterator($path); 

    $bytestotal=0; 
    $nbfiles=0; 
    foreach (new RecursiveIteratorIterator($ite) as $filename=>$cur) { 
     $filesize=$cur->getSize(); 
     $bytestotal+=$filesize; 
     $nbfiles++; 
     $files[] = $filename; 
    } 

    $bytestotal=number_format($bytestotal); 

    return array('total_files'=>$nbfiles,'total_size'=>$bytestotal,'files'=>$files); 
} 

$files = scan_dir('./'); 

echo "Total: {$files['total_files']} files, {$files['total_size']} bytes\n"; 
//Total: 1195 files, 357,374,878 bytes 
?> 
+0

謝謝勞倫斯!這工作完美:) – Neoweiter

+0

沒有probs。很高興幫助 –

+0

@Neoweiter也掃描子子目錄,我以爲你只是想要子目錄級別? –

0
error_reporting(E_ALL); 

function printTabs($level) 
{ 
    echo "<br/><br/>"; 
    $l = 0; 
    for (; $l < $level; $l++) 
     echo "."; 
} 

function printFileCount($dirName, $init) 
{ 
    $fileCount = 0; 
    $st  = strrpos($dirName, "/"); 
    printTabs($init); 
    echo substr($dirName, $st); 

    $dHandle = opendir($dirName); 
    while (false !== ($subEntity = readdir($dHandle))) 
    { 
     if ($subEntity == "." || $subEntity == "..") 
      continue; 
     if (is_file($dirName . '/' . $subEntity)) 
     { 
      $fileCount++; 
     } 
     else //if(is_dir($dirName.'/'.$subEntity)) 
     { 
      printFileCount($dirName . '/' . $subEntity, $init + 1); 
     } 
    } 
    printTabs($init); 
    echo($fileCount . " files"); 

    return; 
} 

printFileCount("/var/www", 0); 

剛纔檢查,它的工作不喜歡這樣。但是結果的對齊不好,邏輯工作

1

如果有人正在計算文件和目錄的總數。

顯示/計數總目錄和分目錄計數

find . -type d -print | wc -l 

顯示/計數主要文件的總數和子DIR

find . -type f -print | wc -l 

顯示/計數從當前目錄中的唯一文件(無子DIR)

find . -maxdepth 1 -type f -print | wc -l 

顯示/計數在當前目錄總目錄和文件(沒有子DIR)

ls -1 | wc -l 
相關問題