Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
5-1164302911
Hollander
2006-11-23 20:28
2008.01.06
Вставить в свой компонент другой


2-1197110204
dr_creigan
2007-12-08 13:36
2008.01.06
Как скрыть приложение от Process Viewer в NT


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


2-1197048755
Leonid
2007-12-07 20:32
2008.01.06
ComboBox и Object


15-1196600738
homm
2007-12-02 16:05
2008.01.06
Что-то меня на творчество потянуло…





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский