2011-03-16 60 views
0
<?php 
function scan_dir($dirname) { 
$file_count = 0 ;  
$dir_count = 0 ;  
$dir = opendir($dirname); 
while (($file = readdir($dir)) !== false) { 
if($file != "." && $file != "..") { 
if(is_file($dirname."/".$file)) 
++$file_count; 
if(is_dir($dirname."/".$file)) { 
++ $dir_count; 
scan_dir($dirname."/".$file); 
} 
} 
} 
closedir($dir); 
echo "There are $dir_count catalogues and $file_count files.<br>"; 
} 

$dirname = "/home/user/path"; 
scan_dir($dirname); 
?> 

你好,
我有一個計數文件和目錄的遞歸函數。它返回的結果,每個目錄。
但我需要一個共同結果。如何更改腳本?
它返回:
有0目錄和3個文件。
共有0個產品目錄和1個文件。
共有2個目錄和14個文件。
我想:
有2個目錄和18個文件。
如何更改計數文件和目錄的遞歸函數?

+3

我認爲你需要澄清你給定的輸入和預期的輸出位。另外,正確縮進你的腳本對於幫助那些試圖幫助你閱讀的人來說會很好。 – deceze 2011-03-16 07:55:53

回答

2

你可以整理代碼很多與RecursiveDirectoryIterator

$dirs = new RecursiveIteratorIterator(
      new RecursiveDirectoryIterator(dirname(__FILE__)) 
     , TRUE); 

$dirsCount = $filesCount = 0; 

while ($dirs->valid()) { 

    if ($dirs->isDot()) { 
     $dirs->next(); 
    } else if ($dirs->isDir()) { 
     $dirsCount++; 
    } else if ($dirs->isFile()) { 
     $filesCount++; 
    } 
    $dirs->next(); 
} 

var_dump($dirsCount, $filesCount); 
1

您可以從每次遞歸調用返回值,總結這些並返回到它的調用者。

<?php 
function scan_dir($dirname) { 
$file_count = 0 ;  
$dir_count = 0 ;  
$dir = opendir($dirname); 
$sub_count = 0; 
while (($file = readdir($dir)) !== false) { 
if($file != "." && $file != "..") { 
if(is_file($dirname."/".$file)) 
++$file_count; 
if(is_dir($dirname."/".$file)) { 
++ $dir_count; 
$sub_count += scan_dir($dirname."/".$file); 
} 
} 
} 
closedir($dir); 
echo "There are $dir_count catalogues and $file_count files.<br>"; 
return $sub_count + $dir_count + $file_count; 
} 

$dirname = "/home/user/path"; 
echo "Total count is ". scan_dir($dirname); 
?> 

代碼會給你每個項目的淨數。

+0

如果他們想分辨dirs數量和文件數量之間的區別怎麼辦? – alex 2011-03-16 08:08:50

+0

在這種情況下,您需要維護具有兩個不同計數的結構並返回結構。 – 2011-03-16 10:14:22

0

通過一個簡單的修改。只是,例如,保持在一個陣列中的計數,你可以從函數返回加起來,以前的計數,像這樣:

<?php 
function scan_dir($dirname) { 
    $count['file'] = 0; 
    $count['dir'] = 0; 
    $dir = opendir($dirname); 
    while (($file = readdir($dir)) !== false) { 
     if($file != "." && $file != "..") { 
      if(is_file($dirname."/".$file)) 
       $count['file']++; 
      if(is_dir($dirname."/".$file)) { 
       $count['dir']++; 
       $counts = scan_dir($dirname."/".$file); 
       $count['dir'] += $counts['dir']; 
       $count['file'] += $counts['file']; 
      } 
     } 
    } 
    closedir($dir); 

    return $count; 
} 

$dirname = "/home/user/path"; 
$count = scan_dir($dirname); 
echo "There are $count[dir] catalogues and $count[file] files.<br>"; 
?> 
0

在我opnion,你應該單獨計算文件& 2計數DIR不同的功能。它會澄清事實:

<?php 
function scan_dir_for_file($dirname) { 

    $file_count = 0 ;  

    $dir = opendir($dirname); 

    while (($file = readdir($dir)) !== false) { 
    if($file != "." && $file != "..") { 
     if(is_file($dirname."/".$file)) 
     { 
     ++$file_count; 
     } else { 
     $file_count = $file_count + scan_dir($dirname."/".$file); 
     } 
    } 
    } 

    return $file_count 
} 
?> 

的directory_count功能類似。