Так что да: сегодня я ленился и гуглил решение для резака печенья для рекурсивного списка каталогов и наткнулся на это. Когда я закончил писать свою собственную функцию (относительно того, почему я даже потратил время на Google, потому что это вне меня - я всегда чувствую необходимость заново изобретать колесо без какой-либо подходящей причины), я был склонен поделиться своим мнением на этом.
Несмотря на то, что существуют мнения за и против использования RecursiveDirectoryIterator, я просто опубликую свой взгляд на простую рекурсивную функцию каталога и избегу политики включения в RecursiveDirectoryIterator.
Вот оно:
function recursiveDirectoryList( $root )
{
/*
* this next conditional isn't required for the code to function, but I
* did not want double directory separators in the resulting array values
* if a trailing directory separator was provided in the root path;
* this seemed an efficient manner to remedy said problem easily...
*/
if( substr( $root, -1 ) === DIRECTORY_SEPARATOR )
{
$root = substr( $root, 0, strlen( $root ) - 1 );
}
if( ! is_dir( $root ) ) return array();
$files = array();
$dir_handle = opendir( $root );
while( ( $entry = readdir( $dir_handle ) ) !== false )
{
if( $entry === '.' || $entry === '..' ) continue;
if( is_dir( $root . DIRECTORY_SEPARATOR . $entry ) )
{
$sub_files = recursiveDirectoryList(
$root .
DIRECTORY_SEPARATOR .
$entry .
DIRECTORY_SEPARATOR
);
$files = array_merge( $files, $sub_files );
}
else
{
$files[] = $root . DIRECTORY_SEPARATOR . $entry;
}
}
return (array) $files;
}
С помощью этой функции ответ о получении количества файлов прост:
$dirpath = '/your/directory/path/goes/here/';
$files = recursiveDirectoryList( $dirpath );
$number_of_files = sizeof( $files );
Но, если вам не нужны служебные данные массива соответствующих путей к файлам - или просто вам это не нужно - нет необходимости передавать счет в рекурсивную функцию, как было рекомендовано.
Можно просто изменить мою исходную функцию, чтобы выполнить подсчет следующим образом:
function recursiveDirectoryListC( $root )
{
$count = 0;
if( ! is_dir( $root ) ) return (int) $count;
$dir_handle = opendir( $root );
while( ( $entry = readdir( $dir_handle ) ) !== false )
{
if( $entry === '.' || $entry === '..' ) continue;
if( is_dir( $root . DIRECTORY_SEPARATOR . $entry ) )
{
$count += recursiveDirectoryListC(
$root .
DIRECTORY_SEPARATOR .
$entry .
DIRECTORY_SEPARATOR
);
}
else
{
$count++;
}
}
return (int) $count;
}
В обеих этих функциях функция opendir () действительно должна быть заключена в условие, если каталог не читается или возникает другая ошибка. Обязательно сделайте это правильно:
if( ( $dir_handle = opendir( $dir ) ) !== false )
{
/* perform directory read logic */
}
else
{
/* do something on failure */
}
Надеюсь, это кому-нибудь поможет ...