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

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

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

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

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


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

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

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

"Чо?" (с)


На объеме в 17 M и выше ошибка I/0 32
...
Рейтинг: 0 / 0
ДОПИСЫВАТЬ текст.файл - не открывая его
    #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
ДОПИСЫВАТЬ текст.файл - не открывая его
    #40027415
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
ДОПИСЫВАТЬ текст.файл - не открывая его
    #40027418
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может лучше и правильней использовать готовые системы логирования?
CiodeSite, Log4Delphi, loggerpro, TMS Logging, GrijjyCloudLogger...
https://github.com/Fr0sT-Brutal/awesome-pascal#logging
...
Рейтинг: 0 / 0
ДОПИСЫВАТЬ текст.файл - не открывая его
    #40027419
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X
Делаю лог-файл по набору действий пользователя и системы, его объемы велики.

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

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

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

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

Кривыми руками всё что угодно будет давать эпизодическую ошибку. Или даже не эпизодическую.
...
Рейтинг: 0 / 0
ДОПИСЫВАТЬ текст.файл - не открывая его
    #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
ДОПИСЫВАТЬ текст.файл - не открывая его
    #40027430
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Может лучше и правильней использовать готовые системы логирования?
CiodeSite, Log4Delphi, loggerpro, TMS Logging, GrijjyCloudLogger...
https://github.com/Fr0sT-Brutal/awesome-pascal#logging


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

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

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


Забыл сказать это все находиться в DLL ....
Сейчас буду "прострочно" ловить ошибку
...
Рейтинг: 0 / 0
ДОПИСЫВАТЬ текст.файл - не открывая его
    #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
ДОПИСЫВАТЬ текст.файл - не открывая его
    #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
ДОПИСЫВАТЬ текст.файл - не открывая его
    #40027455
Александр Спелицин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X

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

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

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


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



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

А с чего ты решил, что должно?
...
Рейтинг: 0 / 0
ДОПИСЫВАТЬ текст.файл - не открывая его
    #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
ДОПИСЫВАТЬ текст.файл - не открывая его
    #40027542
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X
Первичный вопрос актуален - как дописывать файл НЕ ОТКРЫВАЯ

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

посмотрите TFileStream

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

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

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

Нет, не помогло. Всего лишь чуть-чуть уменьшило вероятность конфликтов, а кроме того,
теперь твоя DLL вгоняет вызывающую программу в ступор, роняя её производительность под
плинтус. В морг.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ДОПИСЫВАТЬ текст.файл - не открывая его
    #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
25 сообщений из 34, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ДОПИСЫВАТЬ текст.файл - не открывая его
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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