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

Тема в разделе "PHP", создана пользователем Veles, 9 авг 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Veles

    Veles

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

    PS: Катинок больше 100К, так что нужно какое-то решение кроме того, чтобы загонять весь список в массив и считать кол-во в массиве...
     
  2. dee_motard

    dee_motard

    Регистр.:
    26 июл 2008
    Сообщения:
    247
    Симпатии:
    76
    ну самое тупое решение в лоб выглядит примерно так
    PHP:
    <?php
    $dir   
    "pics/";
    $count 0;
    if(
    is_dir($dir)) 
    {
      if(
    $handle opendir($dir)) 
      {
        while((
    $file readdir($handle)) !== false
         {
           
    $count++;
         }
        
    closedir($handle);
      }
    }
    echo 
    $count;
    ?>
    а вот целый класс под подобные задачи
    http://www.fijiwebdesign.com/fiji-web-design-blog/linear-php-read-directory-class.html

    Добавлено через 35 секунд
    тебе вообще на пхп надо было или на чем-то другом? Что-то я необратил внимания..
     
  3. Nike59

    Nike59

    Регистр.:
    13 ноя 2006
    Сообщения:
    459
    Симпатии:
    100
    Вот так, например:
    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;
    ?>
     
  4. Veles

    Veles

    Регистр.:
    14 мар 2007
    Сообщения:
    219
    Симпатии:
    106
    Как обычно) Идеи подсказали правильные, а решения не совсем точные. В первом случае итоговое значение больше на 2 чем положено. Во втором вообще на работает, так как не знает что такое scandir...

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

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

          } 
    closedir ($dDir); 
     
  5. dee_motard

    dee_motard

    Регистр.:
    26 июл 2008
    Сообщения:
    247
    Симпатии:
    76
    а, ну да, он ".." и "." посчитал, логично.

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

    Насчет улучшить быстродействие - в голову только приходит что можно дернуть системную функцию чтобы она отобразила инфу о каталоге, и спарсить ее ответ..
     
  6. Nike59

    Nike59

    Регистр.:
    13 ноя 2006
    Сообщения:
    459
    Симпатии:
    100
    Прекрасно работает мой вариант. Проверил работу реально. Но... только для PHP5. Функция

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

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

    ZCFD

    Регистр.:
    16 янв 2008
    Сообщения:
    989
    Симпатии:
    437
    ye раз уж спрашиваешь про быстродействие :

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

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

    PS твой вариант не учитывает возможность наличия поддиректорий,хотя если ты ЗНАЕШЬ что их там нет ...
     
  8. dee_motard

    dee_motard

    Регистр.:
    26 июл 2008
    Сообщения:
    247
    Симпатии:
    76
    вот примерно такую конструкцию имел ввиду, если выполнится конечно на удаленном серваке..
    Параметры ls-а подбери под свою задачу, а то у меня и проверить негде..

    PHP:
    $numDirs exec('ls -1p ./pics/| grep "/" | wc -l');
    должно работать куда быстрее перебора стопки файлов
     
    Veles нравится это.
  9. Veles

    Veles

    Регистр.:
    14 мар 2007
    Сообщения:
    219
    Симпатии:
    106
    Почему-то я всегда забываю про команды из консоли, или как они там называются(( Так действительно быстрее в разы, только не совсем универсально) Ну это ничего)
     
  10. anarki

    anarki Прохожие

    PHP:
    $numDirs shell_exec('ls -1 /директория | wc -l');
    Подсчитает без точек.
     
Статус темы:
Закрыта.