Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ограничить размер лог-файла программы [D7, WinXP]


Страницы:   1 2

Tack ©   (2005-02-17 19:52:00) 

Какой вы предложите самый производительный способ ограничить размер лог-файла программы?

Условия задачи:
1) Файл простой текстовый (Text).
2) Файл всегда открывается для дозаписи (Append)
3) Каждая новая запись занимает ровно одну строку (один WriteLn)
4) Ограничение размера - в сотнях килобайт, удалять информацию можно только строками от начала файла.

Хотелось бы не перерасходовать память, загружая лог полностью в TStringList, а писать сразу на диск по 5-10 строк, после каждой группы вызовов WriteLn вызывая Flush.

Размер файла на диске можно контролировать через апишную GetFileSize(), получив дескриптор файла с правами на чтение.

А вот как эффективнее всего удалять лишние строки из начала файла при превышении размера?


Германн   (2005-02-18 02:22:00) [21]

2 Anatoly Podgoretsky ©   (17.02.05 23:52) [14]
>Tack   (17.02.05 20:23) [9]
>А это много?

Для "разбора" лога с целью выяснения чего-то - много. Копаться в "многометровом" логе - не по силам! А ведь в логе нужно именно "копаться", иначе - зачем он нужен!

Кроме того в логе (по умолчанию) может "копаться" и юзер, который многого не знает! А, в добавок, этого самого юзера заставляют высылать лог по почте! И как быть с этими "метрами"?


Anatoly Podgoretsky   (2005-02-17 23:52:00) [22]

Tack   (17.02.05 20:23) [9]
А это много?


Alexander Panov   (2005-02-17 21:46:00) [23]

Разбери пример, приведенный на   http://delphibase.spb.ru/в разделе "Ini-, Log- и др. спецфайлы", вопросы отпадут.


begin...end   (2005-02-17 20:31:00) [24]

> Tack   (17.02.05 20:19) [7]

> А как работает TStringList?

Ответ - в исходниках VCL :-)

Строки (а в TStringList с каждой строкой связан ещё и объект) там хранятся в поле-массиве. Т.е. для того, чтобы получить доступ к конкретной строке, не требуется чтение всех предыдущих строк (как в текстовом файле). При удалении какой-либо строки из списка все стоявшие ниже строки смещаются на одну вверх (это медленно), но в Вашем случае даже не надо ничего удалять. Как только выяснится, что размер списка слишком велик, начинайте писать в список сначала, т.е. перезаписывать строки, находящиеся в начале спсика. Но надо
ещё хорошо подумать, как часто этот список сохранять на диск...


Tack   (2005-02-17 20:30:00) [25]

Всем спасибо.


Германн   (2005-02-17 20:27:00) [26]

Дарю идею. Имя файла для лога формировать так:
DateToStr(Date).Имя программы.log.txt


Tack   (2005-02-17 20:23:00) [27]

Aleks, а если файл - 5-10 МБайт?


Aleks   (2005-02-17 20:21:00) [28]

procedure TForm1.FormActivate(Sender: TObject);
var
i:integer;
begin
if (Если размер файла больше чем надо) then
begin
  Memo1.Lines.LoadFromFile('c:\txt.txt');
  for i:=0 to 3 do // сколько строк удалить, сейчас 3
   Memo1.Lines.Delete(i);
  Memo1.Lines.SaveToFile('c:\txt.txt');
end;
end;


Tack   (2005-02-17 20:19:00) [29]

А как работает TStringList? Т.е. как он в памяти размещается? И будет ли влиять большая интенсивность записи строк в лог на общую производительность системы?


begin...end   (2005-02-17 20:16:00) [30]

> Tack   (17.02.05 20:14) [5]

Тогда, вероятно, всё же придётся TStringList пользовать. ИМХО.


Tack   (2005-02-17 20:14:00) [31]

неа. Все разные


begin...end   (2005-02-17 20:11:00) [32]

> Tack   (17.02.05 20:03) [3]

В файл записываются строки фиксированной длины?


Tack   (2005-02-17 20:03:00) [33]

Так лучше через API файлы создавать?


begin...end   (2005-02-17 19:59:00) [34]

> Tack   (17.02.05 19:52)

> А вот как эффективнее всего удалять лишние строки из
> начала файла при превышении размера?

ИМХО, используя текстовые файлы (Text), сделать это эффективно не получится.


Palladin   (2005-02-17 19:56:00) [35]


> Хотелось бы не перерасходовать память,

? сотней килобайт ты перерасходуешь память? парень, ты на какой машине работаешь...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо