![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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' |
| Этот пользователь сказал Спасибо 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. |