[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Изменение кодировки файлов в директории
DorianLeroy
Всем здрасьте) вообщем хотел изменить кодировку в директории хоторая содержит файлы и поддиректории. Написал такую функцию:
$path="./"; //путь к каталогу, в котором лежат файлы для перекодировки

function change_coding($path){

$handle=opendir($path);
while ($file = readdir($handle)){
if (is_file($path."/".$file)){
#находим по порядку все файлы и перекодируем
$text = file_get_contents($path."/".$file);//читаем данные из файла
#конвертируем текст из «utf-8» в «cp1251» с помощью функции iconv()

$text = iconv("cp1251","utf-8",$text);

file_put_contents($path."/".$file, $text);//пишем данные обратно в файл
}

elseif(is_dir($path."/".$file))
{
$current_dir = $path."/".$file;
change_coding($current_dir);//рекурсивно вызываем функцию и меняем кодировку в поддиректориях

}
}

}


change_coding($path);



выскакивает ошибка
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 71667558 bytes) in Z:\home\localhost\www\php_hacker\book\4copy\change_coding.php on line 18


вобщем директория большая решил сделать через массивы:

<?
/**************
* convert2.php
**************/

$path="./"; //путь к каталогу, в котором лежат файлы для перекодировки

function change_coding($path){

$handle=opendir($path);
while ($file = readdir($handle)){
if (is_file($path."/".$file)){

$arr=file($file);//читаем данные из файла в массив построчно
$cnt=count($arr);//число прочитанных строк из файла
$text=””;
for($i=0; $i<$cnt; $i++){
#конвертируем короткие строки из «utf-8» в «cp1251» с помощью функции iconv()
$text.=iconv( "cp1251","utf-8",$arr[$i]);
}
file_put_contents($file, $text);//пишем данные обратно в файл
}

elseif(is_dir($path."/".$file))
{
$current_dir = $path."/".$file;
change_coding($current_dir);

}
}

}


change_coding($path);

?>


но ошибка остается таже...Как решить проблему?)



Спустя 26 минут, 36 секунд (26.01.2011 - 14:45) DorianLeroy написал(а):
Делал ini_set('memory_limit', '120M'); этого оказалось мало , поставил
ini_set('memory_limit', '1200M');
set_time_limit(120);
сжирается огромное количество байтов впустую)))
Функция написана неверно - а вот где не пойму?)

Спустя 3 часа, 9 минут, 58 секунд (26.01.2011 - 17:55) DorianLeroy написал(а):
Ребята, мне кажется эта функция будет многим полезна, у меня часто такое бывает скачиваешь сайт а он на 1251 весь, и вручную перебирать и переделывать все файлы на юникод- глупо. Помогите исправить функцию?

Спустя 6 минут, 6 секунд (26.01.2011 - 18:01) ZSH написал(а):
if (is_file($path."/".$file) && ($file != '.' || $file != '..'))

Спустя 4 минуты, 9 секунд (26.01.2011 - 18:05) twin написал(а):
Вот. Сам правда не юзал)

Спустя 14 минут, 23 секунды (26.01.2011 - 18:20) inpost написал(а):
ZSH
В больших циклах делать проверку, что это ни '.' и ни '..' существенно долго, так как проверка будет каждый раз запускаться, чем просто unset($file[0] и [1]), так как они идут первыми.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.