Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запись в файл на winapi [D7]


istok ©   (2007-12-09 15:49:00) 

Надо сделать логирование в файл по аналогии с тем как работает Append но на winapi. Что для этого использовать? WriteFile?

судя по описанию WriteFile: "..The function starts writing data to the file at the position indicated by the file pointer.." - надо изначально как-то перемотать файл на конец после openfile?


istok   (2007-12-09 17:27:00) [1]


> Длина CRLF <> 1


ага теперь всё ок,  спасибо.


> DVM ©   (09.12.07 16:28) [6]

спасибо.


Anatoly Podgoretsky   (2007-12-09 17:02:00) [2]

Длина CRLF <> 1


DVM   (2007-12-09 16:28:00) [3]


function PrintLog(LogMessage: string): boolean;
var
 LogFileName: string;
 CurrDir: string;
 hLogFile: HFILE;
 dwPointer: DWord;
 Len: Cardinal;
 NumberOfBytes: Cardinal;
begin
 result := false;
 LogMessage := GetTime + ' - ' + LogMessage + #13#10;
 CurrDir := ExtractFilePath(ParamStr(0));
 if not DirExists(CurrDir + '\Log') then
   if CreateDirEx(CurrDir + '\Log') then
     begin
       LogFileName := CurrDir + '\Log\' + GetDate + '.log';
       hLogFile := CreateFile(PChar(LogFileName), GENERIC_WRITE, FILE_SHARE_READ or
                              FILE_SHARE_WRITE, nil, OPEN_ALWAYS,
                              FILE_ATTRIBUTE_NORMAL, 0);
       if hLogFile <> INVALID_HANDLE_VALUE then
         begin
           dwPointer := SetFilePointer(hLogFile, 0, nil, FILE_END);
           if dwPointer <> $FFFFFFFF then
             begin
               Len := lstrlen(PChar(LogMessage));
               WriteFile(hLogFile, LogMessage[1],  Len, NumberOfBytes, nil);
               if NumberOfBytes = Len then result := true;
             end;
           CloseHandle(hLogFile);
         end;
     end;
end;


istok   (2007-12-09 16:26:00) [4]


> а так пробовал #13#10 ?


Угу. может неправильно реализовал? :

procedure AddLog(AStr: PChar);
const
 filename = 'c:\1.txt';
var
 s: _OFSTRUCT;
 o: POverlapped;
 f: THandle;
 buf: array[0..1024] of Char;
 written: cardinal;
 i: integer;
begin
 for i := 0 to length(AStr)-1 do
   buf[i] := AStr[i];

 buf[length(AStr)] := #13;
 buf[length(AStr)+1] := #10;

 if FileExists2(filename) then
 begin
   f := OpenFile(filename, s, OF_WRITE);
   SetFilePointer(f, 0, 0, FILE_END);
 end
 else
   f := OpenFile(filename, s, OF_CREATE);

 WriteFile(f, buf, length(AStr)+1, written, 0);

 CloseHandle(f);
end;


при таком раскладе в блокноте вижу системные символы вместо переноса строки.


Anatoly Podgoretsky   (2007-12-09 16:25:00) [5]

> istok  (09.12.2007 16:20:02)  [2]

> наверняка есть еще другие косяки,

Да хватает,

1. разделитель строк CRLF
2. длина записи не Length(AAstr), a Length(AAstr) + Length(CRLF)


DVM   (2007-12-09 16:22:00) [6]


> //по-разному пробовал, а каретка не переносится

а так пробовал #13#10 ?


istok   (2007-12-09 16:20:00) [7]

спасибо за ответ, возник другой вопрос:
не могу добиться переноса каретки после каждой строки. что я делаю не так?:

function FileAge(const FileName: PChar): Integer;
var
 Handle: THandle;
 FindData: TWin32FindData;
 LocalFileTime: TFileTime;
begin
 Handle := FindFirstFile(PChar(FileName), FindData);
 if Handle <> INVALID_HANDLE_VALUE then
 begin
   Windows.FindClose(Handle);
   if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
   begin
     FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
     if FileTimeToDosDateTime(LocalFileTime, LongRec(Result).Hi,
       LongRec(Result).Lo) then Exit;
   end;
 end;
 Result := -1;
end;

function FileExists2(const FileName: PChar): Boolean;
begin
 Result := FileAge(FileName) <> -1;
end;

procedure AddLog(AStr: PChar);
const
 filename = 'c:\1.txt';
var
 s: _OFSTRUCT;
 o: POverlapped;
 f: THandle;
 buf: array[0..1024] of Char;
 written: cardinal;
 i: integer;
begin
 for i := 0 to length(AStr)-1 do
   buf[i] := AStr[i];
 //buf[length(AStr)] := #10;  //по-разному пробовал, а каретка не переносится
 buf[length(AStr)] := #13;

 if FileExists2(filename) then
 begin
   f := OpenFile(filename, s, OF_WRITE);
   SetFilePointer(f, 0, 0, FILE_END);
 end
 else
   f := OpenFile(filename, s, OF_CREATE);

 WriteFile(f, buf, length(AStr), written, 0);

 CloseHandle(f);
end;


наверняка есть еще другие косяки, буду рад советам.


MBo   (2007-12-09 15:53:00) [8]

SetFilePointer


Наверх

Титульная страница Поиск, карта сайта Написать письмо