![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запись в файл на 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