Php обход папки рекурсивно

Столкнулся с задачей как сделать в php обход папки, да еще и рекурсией?

Для чего, спросите вы?

Переливал файлы с одного хостинга на другой. И так получилось, что названия всех русские файлы стали крякозябликами.

Вот и подумал через php скрипт обойти папки, и переименовать все файлы.

Если название файла нормальное, то ничего не происходит. А если название испоганилось, то при обходе папки файл переименовывается.

Перед этим, если помните, я писал как же в php удалить элемент массива?

Для обхода папки в php нашёл функцию на просторах интернета, и немного доработал под себя, добавил рекурсию для обхода всех вложенных каталогов.


<?php

/*MAx file names convert  */

renameDirAndFile(".");

// В качестве аргумента передаем путь(имя) до папки.

function renameDirAndFile ($patch) {

$handle = opendir($patch);

  while(($file = readdir($handle))) {

    if (is_file ($patch."/".$file) && getExtension1($file) != "php" ) /*.переименовываем файл.*/

    {

      // Выводим старое имя файла,  Переименовываем выводим новое
      echo $patch .  "/" . $file;
      echo rename ( $patch .  "/" . $file, $patch .  "/" . iconv( 'UTF-8' , 'CP1251' , $file) );
      echo "
";

    }

    if (is_dir ($patch."/".$file) && ($file != ".") && ($file != ".."))
    {
      /* рекусрсивно проходим по директории*/
      renameDirAndFile($patch."/".$file);  // Обходим вложенный каталог

    }
  }

  closedir($handle);

}

function getExtension1($filename) {
  // Возвращаем расширение файла
  return substr($filename, strrpos($filename, '.') + 1);
}

?>

Точка в передаваемом параметре пути обозначает начало обхода с текущей папки, в которой размещен сам файл.

getExtension1(имя файла)  позволяет нам узнать расширения файла, и избежать переименования php файлов.

Фунция opendir(путь) возвращает дескриптор папки, для последующего использования с необходимой нам функцией readdir(дескриптор).

readdir($handle) – возвращает нам имя следующего файла в указанном каталоге, или False, если файлы закончились.

rename(старое имя, новое имя файла) переименовывает файл в php.

Функция is_file(путь к файлу) позволяет узнать, является ли указанный путь файлом.

is_dir(путь) позволяет нам узнать, является ли путь каталогом.

А с помощью iconv(‘UTF-8’ , ‘CP1251’, старое имя файла) мы преобразовываем кодировку файла из CP1251 в UTF8, и избавляемся от кракозябликов в имени файла.

Вот так вот легко можно в php обойти все файлы в папке.

  • Михаил

    Добрый день. Подскажите, как исправить, при наведении на ссылку поп. статьи, в title статьи выводится не название статьи, а цифры, причем это не id статьи. что нужно исправить.?
    Спасибо