Форум: "Начинающим";
Текущий архив: 2008.01.06;
Скачать: [xml.tar.bz2];
ВнизЗапись в файл на 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c