Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как обрезать заданный обьём с конца файла?
 
 автор: Qiao   (31.03.2008 в 11:30)   письмо автору
 
 

Подскажите, пожалуйста, как обрезать заданный обьём с конца файла .
Т.е. файл 10 Кб, требуется отрезать 3 Кб с конца.
Какую функцию использовать?

   
 
 автор: cheops   (31.03.2008 в 11:34)   письмо автору
 
   для: Qiao   (31.03.2008 в 11:30)
 

Если файла такой маленький, то его содержимое проще прочитать в строку при помощи функции file_get_contents(), а затем отрезать от конца строку длинной 3072 символа
<?php
  $contents 
file_get_contents("file.txt");
  
$part substr($contents, -3072);
?>

   
 
 автор: Atheist   (02.04.2008 в 13:57)   письмо автору
 
   для: cheops   (31.03.2008 в 11:34)
 

> <?php
> $contents = file_get_contents("file.txt");
> $part = substr($contents, -3072);
> ?>

А если файл 100 Mb? 1 Gb? ftruncate() для этого существует.

   
 
 автор: cheops   (03.04.2008 в 12:49)   письмо автору
 
   для: Atheist   (02.04.2008 в 13:57)
 

>А если файл 100 Mb? 1 Gb?
файл 10 Кб

   
 
 автор: Atheist_?   (03.04.2008 в 13:09)   письмо автору
 
   для: cheops   (03.04.2008 в 12:49)
 

Ладно. На этот раз меня словили.

   
 
 автор: Valick   (31.03.2008 в 11:39)   письмо автору
 
   для: Qiao   (31.03.2008 в 11:30)
 

Обрезание с конца, вообще-то каккой-то еврейский подход. Файл с данными это не вагон цемента. Расскажите поподробнее каким образом у вас возникла такая задача?

   
 
 автор: cheops   (31.03.2008 в 11:41)   письмо автору
 
   для: Valick   (31.03.2008 в 11:39)
 

Нормальная задача, в UNIX даже специальная утилита имеется tail со схожей функциональностью. Как правило, такая необходимость возникает, когда требуется прочитать последние сообщения в объёмных логах.

   
 
 автор: Valick   (31.03.2008 в 11:43)   письмо автору
 
   для: cheops   (31.03.2008 в 11:41)
 

Мне просто интересно, какого рода данные в файле (текст, графика). А от коламбура не смог удержаться))

   
 
 автор: Qiao   (31.03.2008 в 12:15)   письмо автору
 
   для: Valick   (31.03.2008 в 11:43)
 

Как правильно указал cheops - это лог файл. Данные добавляются сверху.

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

>прочитать в строку при помощи функции file_get_contents(), а затем отрезать от конца строку длинной 3072 символа
Файл в utf8 и символы там не только латинские - значит расхождение символа и байта, и размер файла будет гулять (в сторону уменьшения).
Хотя тут можно вместо фиксированного размера в байтах подсчитать фиксированное количество символов, тогда без проблем.
Спасибо за подсказку.

   
 
 автор: Valick   (31.03.2008 в 12:22)   письмо автору
 
   для: Qiao   (31.03.2008 в 12:15)
 

Тогда и file_get_contents() зачем использовать? Чем не нравится фОпен? Логи пишуться сторками вот и читать можно строками, зачем к байтам привязываться?

   
 
 автор: Qiao   (31.03.2008 в 12:48)   письмо автору
 
   для: Valick   (31.03.2008 в 12:22)
 

Так вот я и спрашиваю - как это делать? Как удалить всё после n-ой строки? Какую функцию использовать?

   
 
 автор: cheops   (31.03.2008 в 12:55)   письмо автору
 
   для: Qiao   (31.03.2008 в 12:48)
 

Можно разбить содержимое файла построчно при помощи функции file(), которая возвращает массив, каждый элемент которого содержит одну строку. Берите последние 10 элементов массива.

   
 
 автор: Valick   (31.03.2008 в 13:11)   письмо автору
 
   для: Qiao   (31.03.2008 в 12:48)
 

Какую функцию использовать?

Её сначала написать надо, а уже потом использовать. Сейчас попытаюсь это сделать, правда проверить неначем.

   
 
 автор: Valick   (31.03.2008 в 13:14)   письмо автору
 
   для: Valick   (31.03.2008 в 13:11)
 

Вот так можно считать файл в массив.

// Функция чтения файла 
function file_to_mass($file) 
    { 
// Открываем файл если он существует 
    if(file_exists($file)) 
        { 
        $f=fopen($file, "r+t") or die("Невозможно открыть файл"); 
// Блокируем файл (разделяемая блокировка) 
        flock($f, LOCK_SH);    // ждём завершения процесса записи 
// В файл теперь никто не пишет, можно читать 
        $cont=explode("\n",fread($f,filesize($file)));    // считываем
        fclose($f);        // закрываем файл 
        } 
    else 
        { 
        $cont="Файл не существует"; 
        } 
// Возвращаем значение 
    return $cont; 
    } 


Связка fread+explode работает быстрее чем file. и удаляет лишние символы перевода строки.
Как из массива сохранить нужные строки в файл, напишу познее.

   
 
 автор: Valick   (31.03.2008 в 14:42)   письмо автору
 
   для: Valick   (31.03.2008 в 13:14)
 

А вот так можно писать.

// Функция записи в файл 
function mass_to_file($file, $mass, $line)
    { 
// Создаём файл если он не существует 
// ни в коем случае не используем w или w+ 
    if(!file_exists($file) 
        { 
        fclose(fopen($file, "a+t"); 
        }
// Сохраняем резервную копию файла
copy ($file,"old.bak");
// Открываем файл для чтения и записи в режиме r+t 
// некоторые версии FreeBSD имеют проблемы с режимом а+ 
// и не могут установить указатель на начало файла при помощи fseek 
    $f=fopen($filename, "r+t") or die("Невозможно открыть файл"); 
// Блокируем файл (блокировка с запретом "подвисания") 
    while(!flock($f, LOCK_EX+LOCK_NB)) 
        {
        sleep(1);    // ждём одну секунду
        }
// Файл заблокирован, можно производить запись 
    ftruncate($f, 0); // очищаем файл
    fseek($f, 0, SEEK_SET); // переходим в начало файла
    if (count($mass)<$line)
    { 
    $line=count($mass); // если кол-во элементов массива меньше заданного параметра
                // пишем сколько есть
    }
    for ($i=0; $i<$line; $i++)
    {
    fwrite ($f, $mass[$i]."\r\n") ; // записываем строку из массива
    }
    fclose($f);        // закрываем файл 
    return; 
    } 


Если где-то допустил ошибку надеюсь меня поправят.

   
 
 автор: Qiao   (02.04.2008 в 09:12)   письмо автору
 
   для: Valick   (31.03.2008 в 14:42)
 

У линукса есть комманда logrotate. Она хорошо логи обрабатывает (архивирует, удаляет и т.п. при наступлении условия).

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования