Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ДОПИСЫВАТЬ текст.файл - не открывая его / 25 сообщений из 34, страница 1 из 2
13.12.2020, 14:12
    #40027404
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
Доброго дня господа !

Делаю лог-файл по набору действий пользователя и системы, его объемы велики.
Как и чем можно "ДОПИСЫВАТЬ" файл, чрезмерно не загружая память.

AssignFile на больших объемах дает эпизодическую ошибку
TStringList - читает весь объем ранее сохраненных строк
CreateFile Windows AP
...
Рейтинг: 0 / 0
13.12.2020, 14:13
    #40027406
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
HOME_X,

CreateFile Windows API - не часто использовал чтобы дать оценку объема

Может есть еще варианты


Заранее благодарен !
...
Рейтинг: 0 / 0
13.12.2020, 14:20
    #40027407
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
HOME_XAssignFile на больших объемах дает эпизодическую ошибку

"Чо?" (с)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.12.2020, 14:23
    #40027408
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
Dimitry Sibiryakov

HOME_XAssignFile на больших объемах дает эпизодическую ошибку

"Чо?" (с)


На объеме в 17 M и выше ошибка I/0 32
...
Рейтинг: 0 / 0
13.12.2020, 14:40
    #40027412
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
HOME_XНа объеме в 17 M и выше ошибка I/0 32

I/O ошибки располагаются в диапазоне 100-149, что-то ты путаешь.
Ошибка 32 у Windows это ERROR_SHARING_VIOLATION и от объёма не зависит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.12.2020, 14:59
    #40027415
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
...
Рейтинг: 0 / 0
13.12.2020, 15:03
    #40027418
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
Может лучше и правильней использовать готовые системы логирования?
CiodeSite, Log4Delphi, loggerpro, TMS Logging, GrijjyCloudLogger...
https://github.com/Fr0sT-Brutal/awesome-pascal#logging
...
Рейтинг: 0 / 0
13.12.2020, 15:05
    #40027419
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
HOME_X
Делаю лог-файл по набору действий пользователя и системы, его объемы велики.

Да ну правда что ли?

HOME_X
Как и чем можно "ДОПИСЫВАТЬ" файл, чрезмерно не загружая память.

Судя по формулировке вопроса, стоит использовать средства классического Турбо Паскаля, то есть Assign (который стал AssignFile) + Append (который остался Append) + WriteLn.

HOME_X
AssignFile на больших объемах дает эпизодическую ошибку

Кривыми руками всё что угодно будет давать эпизодическую ошибку. Или даже не эпизодическую.
...
Рейтинг: 0 / 0
13.12.2020, 15:37
    #40027429
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
softwarer
Или даже не эпизодическую.


Например - где здесь может быть ошибка
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  function WriteFile(Path: String; Str: String):  Boolean;
  var fsoOpen: TextFile;
  begin
      Result:=False;
      AssignFile(fsoOpen,Path);
      if not FileExists(Path) then Rewrite(fsoOpen) else Append(fsoOpen);
      WriteLn(fsoOpen,Str);
      CloseFile(fsoOpen);
      Result:=True;
  end;
...
Рейтинг: 0 / 0
13.12.2020, 15:39
    #40027430
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
X11
Может лучше и правильней использовать готовые системы логирования?
CiodeSite, Log4Delphi, loggerpro, TMS Logging, GrijjyCloudLogger...
https://github.com/Fr0sT-Brutal/awesome-pascal#logging


Cпасибо !
Принято к изучению
...
Рейтинг: 0 / 0
13.12.2020, 15:42
    #40027434
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
Dimitry Sibiryakov

HOME_XНа объеме в 17 M и выше ошибка I/0 32

I/O ошибки располагаются в диапазоне 100-149, что-то ты путаешь.
Ошибка 32 у Windows это ERROR_SHARING_VIOLATION и от объёма не зависит.


Забыл сказать это все находиться в DLL ....
Сейчас буду "прострочно" ловить ошибку
...
Рейтинг: 0 / 0
13.12.2020, 15:48
    #40027436
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
HOME_X
softwarer
Или даже не эпизодическую.


Например - где здесь может быть ошибка
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  function WriteFile(Path: String; Str: String):  Boolean;
  var fsoOpen: TextFile;
  begin
      Result:=False;
      AssignFile(fsoOpen,Path);
      if not FileExists(Path) then Rewrite(fsoOpen) else Append(fsoOpen);
      WriteLn(fsoOpen,Str);
      CloseFile(fsoOpen);
      Result:=True;
  end;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
procedure FileLog(aMessage: string; aLogFileName: string = '');
var
  fLog: THandle;
  BitesWriten: DWORD;
  fDateTimeStr: string;
begin
  if aLogFileName = '' then
    aLogFileName := ChangeFileExt(ParamStr(0), '.Log');
  fLog := CreateFile(PChar(aLogFileName), GENERIC_WRITE,
    FILE_SHARE_WRITE, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  if fLog = INVALID_HANDLE_VALUE then Exit;

  SetFilePointer(fLog, 0, nil, FILE_END);
  DateTimeToString(fDateTimeStr, 'dd.mm.yy hh:mm:ss ', Now());

  aMessage := fDateTimeStr + aMessage + #13#10;
  WriteFile(fLog, aMessage[1], Length(aMessage), BitesWriten, nil);
  CloseHandle(fLog);
end;
...
Рейтинг: 0 / 0
13.12.2020, 17:06
    #40027452
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
Dimitry Sibiryakov

HOME_XНа объеме в 17 M и выше ошибка I/0 32

I/O ошибки располагаются в диапазоне 100-149, что-то ты путаешь.
Ошибка 32 у Windows это ERROR_SHARING_VIOLATION и от объёма не зависит.


Немного соврал - согласен - ОТМОЛИМ !!!!
Каждая команда заключена в свой except
Команда Append - начало ошибки

Опять же на больших объемах свыше 15-17 Mb
Операционка Win10 for 64bit

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
      try
        AssignFile(fsoOpen,Path);
      except
        on E: Exception do if ExistsLog then SaveFile('Save',ExtractFilePath(Values['Log'])+'error.log','AssignFile' + vbLine + E.Message);
      end;
      if not FileExists(Path) then
      begin
        try
          Rewrite(fsoOpen)
        except
          on E: Exception do if ExistsLog then SaveFile('Save',ExtractFilePath(Values['Log'])+'error.log','Rewrite' + vbLine + E.Message);
        end;
      end else begin
        try
          Append(fsoOpen);
        except
          on E: Exception do if ExistsLog then SaveFile('Save',ExtractFilePath(Values['Log'])+'error.log','Append' + vbLine + E.Message);
        end;
      end;
      try
        WriteLn(fsoOpen,Str);
      except
        on E: Exception do if ExistsLog then SaveFile('Save',ExtractFilePath(Values['Log'])+'error.log','WriteLn' + vbLine + E.Message);
      end;
      try
        CloseFile(fsoOpen);
      except
        on E: Exception do if ExistsLog then SaveFile('Save',ExtractFilePath(Values['Log'])+'error.log','CloseFile' + vbLine + E.Message);
      end;
      try
        Result:='True';
      except
        on E: Exception do if ExistsLog then SaveFile('Save',ExtractFilePath(Values['Log'])+'error.log','Result' + vbLine + E.Message);
      end;

-------------- Error log ------------------
Append
I/O error 32
WriteLn
I/O error 103
CloseFile
I/O error 103
-------------------------------------------



спасибо
...
Рейтинг: 0 / 0
13.12.2020, 17:37
    #40027455
Александр Спелицин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
HOME_X

Забыл сказать это все находиться в DLL ....

А еще и имя файла как String наверное туда передавали.... ?
Сначала добейтесь нормальной работы в обычном exe, а затем уже на dll переходите.

Если получили ERROR_SHARING_VIOLATION, то этот объект уже кем-то открыт. Возможно Вашей предыдущей программой или еще чем-либо.
...
Рейтинг: 0 / 0
13.12.2020, 19:19
    #40027481
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
Александр Спелицин
HOME_X

Забыл сказать это все находиться в DLL ....

А еще и имя файла как String наверное туда передавали.... ?
Сначала добейтесь нормальной работы в обычном exe, а затем уже на dll переходите.

Если получили ERROR_SHARING_VIOLATION, то этот объект уже кем-то открыт. Возможно Вашей предыдущей программой или еще чем-либо.


- Имя файла представлено и сохранено ВНУТРИ DLL в качестве поля обьекта - тип поля String

Из вне передаю как PAnsiChar
Код: pascal
1.
  function Create_AddSpan(aFile: PAnsiChar; aList: PAnsiChar; aKind: OleVariant; aBars: OleVariant; aHandle: OleVariant; var aSql: OleVariant; var aRecordSet: OleVariant): Integer; stdcall;




В DLL работало свыше года - пока не достигло некоторых объемов
При малых обьемах даже намека не было на ошибку

ERROR_SHARING_VIOLATION
Запись в TXT - лог в данном конкретном месте ведеться в цикле

Можно ли предположить что предидущая итерация цикла не успевает сбросить весь обьем текстовика на диск
а следующая итерация цикла пытаеться открыть этот файл ?
Такое предположение к месту ?
Как проверить - устранить ?

Спасибо
...
Рейтинг: 0 / 0
13.12.2020, 19:31
    #40027487
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    try
        WriteLn(fsoOpen,Str);
      except
        on E: Exception do if ExistsLog then SaveFile('Save',ExtractFilePath(Values['Log'])+'error.log','WriteLn ' + E.Message);
      end;
      try
        Flush(fsoOpen);
      except
        on E: Exception do if ExistsLog then SaveFile('Save',ExtractFilePath(Values['Log'])+'error.log','Flush ' + E.Message);
      end;
 
...
Рейтинг: 0 / 0
14.12.2020, 00:16
    #40027527
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
HOME_X,


Код: pascal
1.
  Flush(fsoOpen);



Не фига не помогает
...
Рейтинг: 0 / 0
14.12.2020, 01:14
    #40027533
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
HOME_XНе фига не помогает

А с чего ты решил, что должно?
...
Рейтинг: 0 / 0
14.12.2020, 02:12
    #40027540
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
Dimitry Sibiryakov,

поставил задержку во времени и повтор открытия
Помогло !


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
      AssignFile(fsoOpen,Path);
      if not FileExists(Path) then Rewrite(fsoOpen)
      else begin
        try
          Append(fsoOpen);
        except
          Sleep(5000);
          try
            Append(fsoOpen);
          except
            on E: Exception do if ExistsLog then WorkFile('Save',ExtractFilePath(Values['Log'])+'error.log','Append '+E.Message+' '+Str);
          end;
        end;
      end;
      WriteLn(fsoOpen,Str);
      Flush(fsoOpen);
      CloseFile(fsoOpen);



CloseFile - не успевает зафетчить файл на диск

Первичный вопрос актуален - как дописывать файл НЕ ОТКРЫВАЯ и не загружая его целяком

Спасибо !
...
Рейтинг: 0 / 0
14.12.2020, 02:22
    #40027542
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
HOME_X
Первичный вопрос актуален - как дописывать файл НЕ ОТКРЫВАЯ

отвечает Александр ДрузьА зачем его закрывать?
...
Рейтинг: 0 / 0
14.12.2020, 02:48
    #40027543
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
HOME_X,

посмотрите TFileStream

это очень мощное и быстрое средство
...
Рейтинг: 0 / 0
14.12.2020, 10:06
    #40027558
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
HOME_X
Первичный вопрос актуален - как дописывать файл НЕ ОТКРЫВАЯ и не загружая его целяком

Не открывая - это круто. Силой мысли? :)

Посмотри в https://github.com/wadman/wthread модуль wlog. Потокобезопасно и без конфликтов между записями в файл.
...
Рейтинг: 0 / 0
14.12.2020, 11:32
    #40027568
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
У меня многопоточный логгер на винапи с открытием-закрытием на каждый вызов, порядка 100 записей в секунду, никаких "эпизодических ошибок", так что ошибка явно не в средствах
...
Рейтинг: 0 / 0
14.12.2020, 13:52
    #40027620
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
HOME_Xпоставил задержку во времени и повтор открытия
Помогло !

Нет, не помогло. Всего лишь чуть-чуть уменьшило вероятность конфликтов, а кроме того,
теперь твоя DLL вгоняет вызывающую программу в ступор, роняя её производительность под
плинтус. В морг.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.12.2020, 14:03
    #40027626
DSKalugin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ДОПИСЫВАТЬ текст.файл - не открывая его
Класс для логирования.
Пишет по кругу файл с максимальным размером 64МБ
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
unit wsLogFile;

interface

uses Classes, SysUtils;

type
  TLogFile = class
  private
    FileName, FFilePath: String;
    FMaxLogSize: Integer;
  protected
    FS: TFileStream;
  public
    property FilePath: String read FFilePath;
    property MaxLogSize: Integer read FMaxLogSize write FMaxLogSize;
    constructor Create(Prefix: String; LogDir: String = ''); overload;
    destructor Destroy; override;
    procedure Write(Msg: String = '');
  end;

implementation

{ TLogFile }

constructor TLogFile.Create(Prefix: String; LogDir: String);
begin
  MaxLogSize  := 64 * 1024 * 1024; //  64 Мб
  FileName    := Format('%s%s.log', [Prefix, {FormatDateTime('_yymmddhhnnss', Now)}'']);

  if (Trim(LogDir) = '') then
    LogDir := IncludeTrailingBackslash(ExtractFileDir(GetModuleName(0))) + '.logs\';

  if not DirectoryExists(LogDir) then
    ForceDirectories(LogDir);

  FFilePath := LogDir + FileName;

  if DirectoryExists(LogDir) then
  begin
    case FileExists(LogDir + FileName) of
      True:   FS := TFileStream.Create(FilePath, fmOpenWrite or fmShareDenyWrite);
      False:  FS := TFileStream.Create(FilePath, fmCreate or fmOpenWrite or fmShareDenyWrite);
    end;
    FS.Seek(FS.Size, soFromBeginning);
  end
    else
  raise Exception.Create(Format('Не могу создать каталог [%s]!', [LogDir]));
end;

destructor TLogFile.Destroy;
begin
  FS.Free;
  inherited;
end;

procedure TLogFile.Write(Msg: String);
var
  TS: AnsiString;
begin
  if ((MaxLogSize > 0) and (FS.Size > MaxLogSize)) then
  begin
    FS.Size     := 0;
    FS.Position := 0;
  end;
  TS := AnsiString(Format('[%s] ', [FormatDateTime('dd.mm.yyyy hh:nn:ss.zzz', Now)]));
  FS.Write(PAnsiChar(TS)^, Length(TS));
  FS.Write(PAnsiChar(AnsiString(Msg+#13#10))^, Length(AnsiString(Msg+#13#10)));
end;

end.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ДОПИСЫВАТЬ текст.файл - не открывая его / 25 сообщений из 34, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]