перебор папок и файлов, транслитерация

antonim

Новичок
перебор папок и файлов, транслитирование

необходимо переделать достаточно большое кол-во папок и файлов с русского на транслит. Посоветуйте кто делал. Нашел функции типа: scandir для сканирования папки, дальше думаю переиминовывать (правда пока не знаю как это сделать) все файлы и папки, после все названия, где нет точек - папки заходить туда и там делать тоже самое...
Пока только образно представляю себе как это делать. Если кто сталкивался, плз киньте ссылку на корректное решение, или на инфу относящуюся к такой задаче. Любой подсказке буду рад.
 

Активист

Активист
Команда форума
> (правда пока не знаю как это сделать)
Глаза боятся, а руки делают. (C) Русские Народные.
 

jonjonson

Охренеть
antonim, для начала напиши на русском языке алгоритм. Например:

Переименовать содержимое папки:
- Получить список содержимого папки
- Для каждого элемента списка содержимого папки
-- Если элемент файл и содержит русские символы
--- Переименовать файл
-- Иначе если элемент папка
--- Переименовать содержимое папки
--- Если имя папки содержит русские символы
---- Переименовать папку
и т.д.
 

antonim

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

PHP:
function translit($st)
{
  $st = strtr($st, "абвгдеёзийклмнопрстуфхъыэ", "abvgdeeziyklmnoprstufh'ie");
  $st = strtr($st, "АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЭ", "ABVGDEEZIYKLMNOPRSTUFH'IE");
  $st = strtr($st, array(" "=>"_", "ж"=>"zh", "ц"=>"ts", "ч"=>"ch", "ш"=>"sh", "щ"=>"shch", "ь"=>"'", "ю"=>"yu", "я"=>"ya", "Ж"=>"ZH", "Ц"=>"TS", "Ч"=>"CH", "Ш"=>"SH", "Щ"=>"SHCH", "Ь"=>"'", "Ю"=>"YU", "Я"=>"YA"));
  return $st;
}


function tansl()
{

if ($handle = opendir(getcwd())) 
{
    echo "Дескриптор каталога: $handle\n";
    echo "Файлы:\n";

    /* Именно этот способ чтения элементов каталога является правильным. */
    while (false !== ($file = readdir($handle))) 
    { 
        if ($file != "." && $file != "..")
        {
                
            $transl_file = translit($file);
            
            rename($file,$transl_file);
                
            echo "$transl_file\n";
            
            // это попытка сделать рекурсию, которая перебирает все вложенные папки 
            if (is_dir($transl_file))
            {
                opendir($transl_file); 
                tansl(); 
            }
            // это попытка сделать рекурсию +++++++++++++++++++++++++++++++++++++++
        }
    }
closedir($handle); 
}
}

tansl();
 

Фанат

oncle terrible
Команда форума
antonim
работа программиста состоит не в том, чтобы накалякать пицот строк кода, а потом пойти к кому-нибудь, чтобы он заставил это работать.
работа программиста заключается в отладке и поиске ошибок

-~{}~ 03.02.09 14:00:

а отладка - это не втыкать часами в один и тот же код, пытаясь постичь потусторонним взглядом ошибку, а совершение осмысленных действий.

Вы только что прослушали лекцию "Программирование для новичков"
 

antonim

Новичок
вот работающий код все перебирает и заменяет, кому надо пользуйтесь на здоровье:

PHP:
function translit($st)
{
  $st = strtr($st, "абвгдезийклмнопрстуфхъ", "abvgdeziyklmnoprstufh\"");
  $st = strtr($st, "АБВГДЕЗИЙКЛМНОПРСТУФХЪ", "ABVGDEZIYKLMNOPRSTUFH\"");
  $st = strtr($st, array(" "=>"_", "ё"=>"yo","ж"=>"zh", "ц"=>"c", "ч"=>"ch", "ш"=>"sh", "щ"=>"shch", "ы"=>"y'", "ь"=>"'", "э"=>"eh", "ю"=>"yu", "я"=>"ya", "Ё"=>"YO","Ж"=>"ZH", "Ц"=>"C", "Ч"=>"CH", "Ш"=>"SH", "Щ"=>"SHCH", "Ы"=>"Y'", "Ь"=>"'","Э"=>"EH", "Ю"=>"YU", "Я"=>"YA"));
  return $st;
}


function tansl($dir)
{

if ($handle = opendir($dir)) 
{
    //echo "Дескриптор каталога: $handle\n";
    //echo "Файлы:\n";

    /* Именно этот способ чтения элементов каталога является правильным. */
    while (false !== ($file = readdir($handle))) 
	{ 
        if ($file != "." && $file != "..")
		{
                
        	$transl_file = translit($file);
			
			rename($dir."\\".$file,$dir."\\".$transl_file);
				
		//	echo "$dir\\$file-$dir\\$transl_file</br>";
			
			// это попытка сделать рекурсию, которая перебирает все вложенные папки 
			if (is_dir($dir."\\".$transl_file))
			{
				$dir1 = $dir."\\".$transl_file;
		//		echo $dir1,"</br>";
				
				tansl($dir1); 
			}
			// это попытка сделать рекурсию +++++++++++++++++++++++++++++++++++++++
		}
    }
closedir($handle); 
}
}
 
tansl(getcwd());
 

Фанат

oncle terrible
Команда форума
замечательно.
вот это прекрасный пример нормального подхода к делу.

кстати, рекомендую [m]glob[/m], чтобы уйти от этого ужасного синтаксиса опендир-реаддир.
Там в комментах, кстати, есть пример рекурсивного вызова.

-~{}~ 03.02.09 15:29:

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