Подскажите код перебора файлов и каталогов в папке

Тема в разделе "PHP", создана пользователем dump1111, 21 фев 2010.

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

    dump1111

    Регистр.:
    7 июл 2009
    Сообщения:
    266
    Симпатии:
    8
    Подскажите как решить такую задачу. Имеется папка и в ней .txt файлы и папки, в которых также находятся другие .txt файлы и могут находится другие папки и т.д. Нужно последовательно перебрать каждый файл в папке в во всех подпапках.
     
  2. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Самый тупой вариант для PHP4 без итераторов, без ничего.
    Разберешься.
    PHP:
    $files = array();
    function 
    retxt($dir) {
       global 
    $files;
       
    $h opendir($dir);
       while(
    $f readdir($h)) if ($f != '.' && $f != '..') {
            if (
    is_dir("$dir/$f")) retxt("$dir/$f");
            else if (
    preg_match('#\.txt$#i',$f)) $files[] = "$dir/$f";
       }
    }

    retxt('ПАПКА');
    foreach(
    $files as $file) {
      
    // последовательно перебираем все txt в той папке и ее подпапках
    }
     
    vital1103 и dump1111 нравится это.
  3. reserved22

    reserved22 Писатель

    Регистр.:
    19 янв 2010
    Сообщения:
    4
    Симпатии:
    2
    Лучше использовать glob: красивее код, +можно искать по маске.
    Пример кода:

    PHP:
    // Вызов
    chdir ("./");
    @
    browser();
    echo 
    "ок";

    // Сама функция
    function browser($dir){
        
    $files glob("*");
        foreach (
    $files as $file){
            if (
    $file == "." || $file == "..") continue;
            echo 
    "$file, "flush();
            if (
    is_dir ($file)){
                
    chdir ($file);
                
    browser($file);
                
    chdir ("..");
            }
        }
    }
     
    dump1111 нравится это.
  4. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Красивее будет с итераторами, а это ничем не красивее предыдущего поста.
    Да и функцию is_dir никто не отменял :-]
     
  5. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Я не юзал glob т.к. он не дает особого выигрыша, и в то же время требует 5-го PHP.

    А если согласен быть совместимым только с 5м, то в сто раз лучше уж итераторы. Вот тут пример:

    http://www.nulled.ws/showpost.php?p=1383294&postcount=3
     
  6. dump1111

    dump1111

    Регистр.:
    7 июл 2009
    Сообщения:
    266
    Симпатии:
    8
    Да, с самим способом перебора я разобрался. Но вот теперь появилась новая задача: нужно не только перебрать файлы и все папки, а обработать каждый .txt файл и скопировать в другую папку, причём структура всех каталогов должна сохранится. В вашем коде копирования не происходило, а просто происходил вывод на экран. Можете подсказать код ещё и для последовательного копирования в другую папку?
     
  7. Miraage

    Miraage Angular/Laravel

    Регистр.:
    3 июн 2008
    Сообщения:
    230
    Симпатии:
    51
    используй рекурсивный обход каталогов средствами SPL
     
  8. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    glob и в 4 был.
     
  9. reserved22

    reserved22 Писатель

    Регистр.:
    19 янв 2010
    Сообщения:
    4
    Симпатии:
    2
    Тоже удивился - как это оно у меня на 4ке работает:)
    Параллельно обходу дерева каталогов создавайте такие же папки, но в "др.месте", и копируйте туда на здоровье:)
    PHP:
        foreach ($files as $file){ 
            if (
    $file == "." || $file == "..") continue; 
            if (
    is_dir ($file)){ 
                
    chdir ($file); 
                
    // создаем директорию
                
    mkdir ("C:\\files\".$file);
                browser(
    $file); 
                chdir ("
    .."); 
            } else {
                echo "
    $file"; flush(); 
                // копируем файлы
            }
        }
     
    dump1111 нравится это.
  10. dump1111

    dump1111

    Регистр.:
    7 июл 2009
    Сообщения:
    266
    Симпатии:
    8
    Да я уже нашёл решение под свой скрипт....
     
Статус темы:
Закрыта.