Главная страница
    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.004 c
2-1197042910
Zheksik
2007-12-07 18:55
2008.01.06
Почему 0.20 <= 0.20 ложь???


2-1197362961
ZLinX
2007-12-11 11:49
2008.01.06
Наследники TGraphicControl


2-1197056115
AntiPupkin
2007-12-07 22:35
2008.01.06
Перечислить ID потоков в открытом процессе


15-1196530694
][-m@n
2007-12-01 20:38
2008.01.06
TImage


4-1179382172
Pearled
2007-05-17 10:09
2008.01.06
Помогите с NetShareGetInfo()





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский