Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.06;
Скачать: CL | DM;

Вниз

Запись в файл на winapi   Найти похожие ветки 

 
istok   (2007-12-09 15:49) [0]

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

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


 
MBo ©   (2007-12-09 15:53) [1]

SetFilePointer


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

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

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;


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


 
DVM ©   (2007-12-09 16:22) [3]


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

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


 
Anatoly Podgoretsky ©   (2007-12-09 16:25) [4]

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

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

Да хватает,

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


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


> а так пробовал #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;


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


 
DVM ©   (2007-12-09 16:28) [6]


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;


 
Anatoly Podgoretsky ©   (2007-12-09 17:02) [7]

Длина CRLF <> 1


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


> Длина CRLF <> 1


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


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

спасибо.



Страницы: 1 вся ветка

Текущий архив: 2008.01.06;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
15-1196266367
Slider007
2007-11-28 19:12
2008.01.06
С днем рождения ! 28 ноября 2007 среда


6-1177537484
Freer
2007-04-26 01:44
2008.01.06
Передача данных между локальными сетями


15-1196511475
helpme
2007-12-01 15:17
2008.01.06
Странная повестка, помогите разобраться.


2-1197041577
smartleds
2007-12-07 18:32
2008.01.06
Подскажите плз как убрать выделение ячейки у StringGrid


5-1164729857
Doma
2006-11-28 19:04
2008.01.06
Как узнать всех наследников TForm и TDataModule в проекте?