Как подсчитать кол-во файлов в директории

Статус
В этой теме нельзя размещать новые ответы.

Veles

Постоялец
Регистрация
14 Мар 2007
Сообщения
265
Реакции
151
Сабж собственно, есть директории, в них картинки, нужно посчитать сколько картинок в указанной директории. Как реализовать можно?

PS: Катинок больше 100К, так что нужно какое-то решение кроме того, чтобы загонять весь список в массив и считать кол-во в массиве...
 
ну самое тупое решение в лоб выглядит примерно так
PHP:
<?php
$dir   = "pics/";
$count = 0;
if(is_dir($dir)) 
{
  if($handle = opendir($dir)) 
  {
    while(($file = readdir($handle)) !== false) 
     {
       $count++;
     }
    closedir($handle);
  }
}
echo $count;
?>

а вот целый класс под подобные задачи


Добавлено через 35 секунд
тебе вообще на пхп надо было или на чем-то другом? Что-то я необратил внимания..
 
Вот так, например:
PHP:
<?php
$pic_count = 0;
$file_count = 0;
$extentions = "/jpg/i"; //Расширение файла картинок
$dir_files = scandir(".");
foreach ($dir_files as $file)
{
 if ($file == "." || $file == "..") continue;
 if (is_file($file))
 {
  $file_count++;
  if(preg_match($extentions, $file, $out)) $pic_count++;
 }
}
echo "Всего в директории " . "имеется файлов: " . $file_count . ", из них картинок: " . $pic_count;
?>
 
Как обычно) Идеи подсказали правильные, а решения не совсем точные. В первом случае итоговое значение больше на 2 чем положено. Во втором вообще на работает, так как не знает что такое scandir...

Вот моё решение, посоветуйте что-нить, как оно в плане быстродействия? Может что улучшить можно?

PHP:
$sPath     = './pics/'; 
$dDir      = opendir($sPath);   // открываем директорию, $dDir - дескриптор 
$iNumFiles = 0;
// цикл считывания директории 
while ($sFileName=readdir($dDir)) 
      { 
      if ($sFileName!='.' && $sFileName!='..') 
         { 
		 $iNumFiles++; //это и есть кол-во картинок
         } 
      } 
closedir ($dDir);
 
а, ну да, он ".." и "." посчитал, логично.

С твоей поправкой самое то получилось, не обвинить в использовании готовых решений.. Так держать! :)

Насчет улучшить быстродействие - в голову только приходит что можно дернуть системную функцию чтобы она отобразила инфу о каталоге, и спарсить ее ответ..
 
Как обычно) Идеи подсказали правильные, а решения не совсем точные. В первом случае итоговое значение больше на 2 чем положено. Во втором вообще на работает, так как не знает что такое scandir...

Прекрасно работает мой вариант. Проверил работу реально. Но... только для PHP5. Функция

array scandir ( string $directory [, integer $sorting_order] )

появилась только в PHP5. Об этом я не подумал, что в 4-й версии ее нет. Первый скрипт тоже рабочий, но он считает и директорию и родительскую директорию как файлы. Причем считает все файлы, а не только файлы картинок. Мой скрипт считает только файлы и отдельно файлы картинок.
 
ye раз уж спрашиваешь про быстродействие :

зачем тебелишние
PHP:
if ($sFileName!='.' && $sFileName!='..')
в итерации ?

убери их и просто уменьши полученное значение на 2

PS твой вариант не учитывает возможность наличия поддиректорий,хотя если ты ЗНАЕШЬ что их там нет ...
 
вот примерно такую конструкцию имел ввиду, если выполнится конечно на удаленном серваке..
Параметры ls-а подбери под свою задачу, а то у меня и проверить негде..

PHP:
$numDirs = exec('ls -1p ./pics/| grep "/" | wc -l');

должно работать куда быстрее перебора стопки файлов
 
Почему-то я всегда забываю про команды из консоли, или как они там называются(( Так действительно быстрее в разы, только не совсем универсально) Ну это ничего)
 
PHP:
$numDirs = shell_exec('ls -1 /директория | wc -l');
Подсчитает без точек.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху