За последние 24 часа нас посетили 21730 программистов и 1065 роботов. Сейчас ищут 673 программиста ...

Сканирование директории и всех вложеных директорий

Тема в разделе "Решения, алгоритмы", создана пользователем [vs], 30 июн 2009.

  1. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Код (PHP):
    1. <?php
    2. function scandirs($start)
    3. {
    4.     $files = array();
    5.     $handle = opendir($start);
    6.     while (false !== ($file = readdir($handle)))
    7.     {
    8.         if ($file != '.' && $file != '..')
    9.         {
    10.             if (is_dir($start.'/'.$file))
    11.             {
    12.                 $dir = scandirs($start.'/'.$file);
    13.                 $files[$file] = $dir;
    14.             }
    15.             else 
    16.             {
    17.                 array_push($files, $file);
    18.             }
    19.         }
    20.     }
    21.     closedir($handle);
    22.     return $files; 
    23. }
    24. ?>
     
  2. PHP:
    1.  
    2. <?
    3. $path = realpath('/etc');
    4.  
    5. $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
    6. foreach($objects as $name => $object){
    7.     echo "$name\n";
    8. }
    =)
     
  3. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    флоппик
    =)

    Koc
    А она без вложеных папок сканирует.
     
  5. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    не понял
    Код (Text):
    1.         if( is_dir($outerDir."/".$d) ) $dir_array[ $d ] = getDirectoryTree( $outerDir."/".$d );
    2.         else $dir_array[ $d ] = $d;
     
  6. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    [vs] прикалываешся чтоли?
    или я не догоняю?

    PHP:
    1.  
    2. <?
    3. function ScanDirs($dir){
    4.    $res=array();
    5.    $fp=scandir($dir);
    6.    if($fp[2]){
    7.       for($i=2,$c=count($fp);$i<$c;$i++){
    8.            if(is_dir($fd=$dir."/".$fp[$i])){
    9.               $res[$dir][$fd]=array_shift(ScanDirs($fd));
    10.            }else{
    11.               $res[$dir][]=$fp[$i];
    12.           }
    13.       }
    14.    }
    15.    return $res;
    16. }
    17. ?>
     
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Koc
    Я просто по заголовку посмотрел что про функцию scandir, комментарии не заметил.
    А моя функция самая быстрая =)
     
  8. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Mr.M.I.T.
    Всякие должны быть решения и алгоритмы в этом разделе. Я в свое время долго втыкал, как же директорию просканировать.
     
  9. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
     
  10. N!k0

    N!k0 Активный пользователь

    С нами с:
    9 июн 2009
    Сообщения:
    10
    Симпатии:
    0
    Недавно нужна была такая функция. В результате получилось тоже самое. Но предварительно я посмотрел как подобное реализовано в CMS Joomla, так вот там работа с папками и файлами осуществляется через FTP и при невозможности прибегают уже к функциям файловой системы. Интересно почему!? может так быстрее!?
     
  11. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    N!k0
    Не стоит брать примеры с опенсорсных продуктов. Большинство того, что я видел, просто хлам, работающий на соплях.
     
  12. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Kreker
    а откуда стоит брать примеры?

    имхо, процентное соотношение хлама в мире опенсорс и в мире клоузсорс одинаково.
     
  13. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    достаточно лишь посмотреть на исходники DLE или Slaed


    Но порой использовать опенсорсные куски кода не стоит из-за лицензии на них
     
  14. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Почти в два раза медленнее, чем scandir.
     
  15. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Сканирование с заданой глубиной
    Код (PHP):
    1. <?php
    2. function scandirs($start, $deep = false) {
    3.     static $current_level = 0;
    4.     $files = array();
    5.     $handle = opendir($start);
    6.     while (false !== ($file = readdir($handle))) {
    7.         if ($file != '.' && $file != '..') {
    8.             if (is_dir($start.'/'.$file)) {
    9.                 if ($current_level === $deep) {
    10.                     continue;
    11.                 }
    12.                 $current_level++;
    13.                 $dir = scandirs($start.'/'.$file, $deep);
    14.                 $files[$file] = $dir;
    15.             } else {
    16.                 array_push($files, $file);
    17.             }
    18.         }
    19.     }
    20.     closedir($handle);
    21.     $current_level--;
    22.     return $files;
    23. }
     
  16. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    [vs]
    развиваешься? ))
     
  17. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Попробовал написать что-то своё. Получил следующее:

    PHP:
    1. <?php
    2. function my_scandir( $dir, $deep = 0, $with_links = true)
    3. {
    4.     // Current level
    5.     static $level = 0;
    6.  
    7.     rtrim( $dir, '/'); // Delte slash in the end, if exists
    8.  
    9.     // Result array
    10.     $result = array();
    11.  
    12.     // If directory, cycling
    13.     if( is_dir( $dir))
    14.     {
    15.         $level++; // increasing deep level
    16.         $result[] = $dir; // adding the directory to the results
    17.  
    18.  
    19.         $dir .= '/';
    20.         if( is_readable( $dir)) // if we can read directy,
    21.         {
    22.             $files = scandir( $dir); // getting all files
    23.  
    24.             if( $deep == 0 || $level <= $deep) // deep restriction
    25.             {
    26.  
    27.                 foreach( $files as $file)
    28.                 {
    29.                     // adding to the result, if $with_links is true
    30.                     if( $file == '.' || $file == '..')
    31.                     {
    32.                         if( $with_links)
    33.                             $result[] = $dir .$file;
    34.                         continue;
    35.                     }
    36.  
    37.                     // scanning, if it's directory *RECURSION*
    38.                     if( is_dir( $dir .$file))
    39.                         $result = array_merge( $result, my_scandir( $dir .$file , $deep, $with_links));
    40.                     // adding to the results if it's file
    41.                     else
    42.                         $result[] = $dir .$file;
    43.                 }
    44.             }
    45.         }
    46.     }
    47.  
    48.     // If file, adding to the result array
    49.     elseif( is_file( $dir))
    50.         $result[] = $dir;
    51.  
    52.     $level--;
    53.  
    54.     return $result;
    55. }
    56. ?>