|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Разбить файл логов
Нужно сделать так, чтобы файл логов не разростался.
Делаю так: если файл больше определенного размера, то переименовываю его и создаю новый. Нагуглил пару порцедурок. Код:
function FileSize(fileName : wideString) : Int64; var sr : TSearchRec; begin if FindFirst(fileName, faAnyFile, sr ) = 0 then result := Int64(sr.FindData.nFileSizeHigh) shl Int64(32) + Int64(sr.FindData.nFileSizeLow) else result := -1; FindClose(sr) ; end; Код:
procedure AddToLog(s:string); var fn:string; F:TextFile; name: string; begin Fn:=ExtractFilePath(ParamStr(0))+'log.txt'; assignFile(f,fn); if FileExists(fn) then begin // ShowMessage(IntToStr(FileSize(fn))); if FileSize(fn) > 100 then begin name := 'log'+DateTimeToStr(Now); name := StringReplace(name, '.', '-', [rfReplaceAll, rfIgnoreCase]); name := StringReplace(name, ':', '-', [rfReplaceAll, rfIgnoreCase]); name := name + '.txt'; RenameFile(fn,ExtractFilePath(ParamStr(0)) + name); end else begin Append(f); end; end else Rewrite(f); Writeln(f, DateTimeToStr(Now)+s); Flush(f); CloseFile(f); end; Первая проблема, не работает if FileSize(fn) > 100, наверно из-за разных типов данных. Вторая, вылетает ошибка I/O error 103 после строки кода: RenameFile(fn,ExtractFilePath(ParamStr(0)) + name); Файл при этом переименовывается, но не создается новый (log.txt). Подскажите, как исправить? Или может у кого-нибудь есть по лучше способ избавиться от большого лога? |
#2
|
||||
|
||||
Наверное лучше так построить эту процедуру, заполнение патч-переменной fn предпочтительно выполнить всего один раз, напр. при создании формы - прога по-любому во время выполнения никуда не денется
Код:
var fn: string; ... procedure AddToLog(s: string); var f: TextFile; begin AssignFile(f, fn); if FileExists(fn) then Append(f) else Rewrite(f); Writeln(f, DateTimeToStr(Now) + s); if FileSize(f) > 100 then begin CloseFile(f); RenameFile(fn, ChangeFileExt(ExtractFileName(fn), '') + FormatDateTime('dd-mm-yyyy hh-nn-ss', Now) + '.txt'); end else CloseFile(f); end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 10.09.2014 в 23:58. |
#3
|
|||
|
|||
А как быть с типами файлов? На FileSize(f) ругается Incompatible types: 'WideString' and 'Text' |
#4
|
||||
|
||||
Вот пример
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
ivankom (11.09.2014)
|
#6
|
||||
|
||||
Тогда открывайте файл не как текстовый, а как file of byte, размер будет совпадать со значением FileSize, только записывать инфу придётся немного по-другому, с самостоятельным переводом каретки #13#10 в конце каждой строки
Добавлено немного позже: Примерно вот так ещё можно Код:
procedure AddToLog(s: string); var f : TextFile; fs: file of byte; begin AssignFile(f, fn); AssignFile(fs, fn); if FileExists(fn) then Append(f) else Rewrite(f); WriteLn(f, DateTimeToStr(Now) + s); CloseFile(f); Reset(fs); if FileSize(fs) > 100 then begin CloseFile(fs); RenameFile(fn, ChangeFileExt(ExtractFileName(fn), '') + FormatDateTime('dd-mm-yyyy hh-nn-ss', Now) + '.txt'); end else CloseFile(fs); end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 11.09.2014 в 08:23. |