Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.09.2014, 13:56
ivankom ivankom вне форума
Прохожий
 
Регистрация: 04.02.2014
Сообщения: 21
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию Разбить файл логов

Нужно сделать так, чтобы файл логов не разростался.
Делаю так: если файл больше определенного размера, то переименовываю его и создаю новый.
Нагуглил пару порцедурок.

Код:
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  
Старый 10.09.2014, 19:21
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Наверное лучше так построить эту процедуру, заполнение патч-переменной 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;
в текстовом файле функция FileSize возвращает кол-во строк а не байтов, причём строкой считается кусок в 255 знаков, т.е. пока он не будет ими заполнен перехода на следующую строку не произойдёт, это нужно учитывать

Последний раз редактировалось Alegun, 10.09.2014 в 23:58.
Ответить с цитированием
  #3  
Старый 11.09.2014, 04:54
ivankom ivankom вне форума
Прохожий
 
Регистрация: 04.02.2014
Сообщения: 21
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию


А как быть с типами файлов?
На FileSize(f) ругается
Incompatible types: 'WideString' and 'Text'
Ответить с цитированием
  #4  
Старый 11.09.2014, 05:07
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Вот пример
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
ivankom (11.09.2014)
  #5  
Старый 11.09.2014, 07:19
ivankom ivankom вне форума
Прохожий
 
Регистрация: 04.02.2014
Сообщения: 21
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Вот пример
Спасибо, разобрался с этим.
Только с FileSize не до конца понял, т.е. если мне нужно делить файлы по 255 символов, я сравниваю >1?
Ответить с цитированием
  #6  
Старый 11.09.2014, 07:47
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Тогда открывайте файл не как текстовый, а как 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.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:44.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter