|
|
|
| Подскажите, пожалуйста, как обрезать заданный обьём с конца файла .
Т.е. файл 10 Кб, требуется отрезать 3 Кб с конца.
Какую функцию использовать? | |
|
|
|
|
|
|
|
для: Qiao
(31.03.2008 в 11:30)
| | Если файла такой маленький, то его содержимое проще прочитать в строку при помощи функции file_get_contents(), а затем отрезать от конца строку длинной 3072 символа
<?php
$contents = file_get_contents("file.txt");
$part = substr($contents, -3072);
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(31.03.2008 в 11:34)
| | > <?php
> $contents = file_get_contents("file.txt");
> $part = substr($contents, -3072);
> ?>
А если файл 100 Mb? 1 Gb? ftruncate() для этого существует. | |
|
|
|
|
|
|
|
для: Atheist
(02.04.2008 в 13:57)
| | >А если файл 100 Mb? 1 Gb?
файл 10 Кб | |
|
|
|
|
|
|
|
для: cheops
(03.04.2008 в 12:49)
| | Ладно. На этот раз меня словили. | |
|
|
|
|
|
|
|
для: Qiao
(31.03.2008 в 11:30)
| | Обрезание с конца, вообще-то каккой-то еврейский подход. Файл с данными это не вагон цемента. Расскажите поподробнее каким образом у вас возникла такая задача? | |
|
|
|
|
|
|
|
для: Valick
(31.03.2008 в 11:39)
| | Нормальная задача, в UNIX даже специальная утилита имеется tail со схожей функциональностью. Как правило, такая необходимость возникает, когда требуется прочитать последние сообщения в объёмных логах. | |
|
|
|
|
|
|
|
для: cheops
(31.03.2008 в 11:41)
| | Мне просто интересно, какого рода данные в файле (текст, графика). А от коламбура не смог удержаться)) | |
|
|
|
|
|
|
|
для: Valick
(31.03.2008 в 11:43)
| | Как правильно указал cheops - это лог файл. Данные добавляются сверху.
Нет необходимости, чтобы он рос выше сотни килобайт, а руками отрезать муторно, тем более он не один. Хочу написать скрипт и засунуть его в крон.
>прочитать в строку при помощи функции file_get_contents(), а затем отрезать от конца строку длинной 3072 символа
Файл в utf8 и символы там не только латинские - значит расхождение символа и байта, и размер файла будет гулять (в сторону уменьшения).
Хотя тут можно вместо фиксированного размера в байтах подсчитать фиксированное количество символов, тогда без проблем.
Спасибо за подсказку. | |
|
|
|
|
|
|
|
для: Qiao
(31.03.2008 в 12:15)
| | Тогда и file_get_contents() зачем использовать? Чем не нравится фОпен? Логи пишуться сторками вот и читать можно строками, зачем к байтам привязываться? | |
|
|
|
|
|
|
|
для: Valick
(31.03.2008 в 12:22)
| | Так вот я и спрашиваю - как это делать? Как удалить всё после n-ой строки? Какую функцию использовать? | |
|
|
|
|
|
|
|
для: Qiao
(31.03.2008 в 12:48)
| | Можно разбить содержимое файла построчно при помощи функции file(), которая возвращает массив, каждый элемент которого содержит одну строку. Берите последние 10 элементов массива. | |
|
|
|
|
|
|
|
для: Qiao
(31.03.2008 в 12:48)
| | Какую функцию использовать?
Её сначала написать надо, а уже потом использовать. Сейчас попытаюсь это сделать, правда проверить неначем. | |
|
|
|
|
|
|
|
для: 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 в 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;
}
|
Если где-то допустил ошибку надеюсь меня поправят. | |
|
|
|
|
|
|
|
для: Valick
(31.03.2008 в 14:42)
| | У линукса есть комманда logrotate. Она хорошо логи обрабатывает (архивирует, удаляет и т.п. при наступлении условия). | |
|
|
|