Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

CreateFile и WriteFile? [D6, Win95/98, Win2k]


Filat ©   (2002-08-21 14:50:00) 

Привет ALL! Возникла проблема с созданием файла и записью в него, как это сделать правильно?
Сейчас делаю так:
procedure TMain_kb.WriteLnLog(S:String);
var
fff : system.text;
fn: String;
begin
fn:=DirPrg+"\"+date_dir+"\"+date_dir+".log";
system.Assign(fff, fn);
{$i-}
system.Append(fff);
{$i+}
if ioresult<>0 then
begin
{$i-}
system.Rewrite(fff);
{$i+}
end;
if ioresult=0 then
begin
WriteLn(fff, DateTimeToStr(Now())+" "+s);
system.Close(fff);
end;
end;
но через раз появляется ошибка, о том что файл занят приложением.
Что неправильно в этом коде или как сделвть через CreateFile и WriteFile? + с возможностью дозаписывать в файл. Необходимо вести лог программы, чего она делает.
Заранее благодарен.


Polevi   (2002-08-23 18:18:00) [1]

PS
обработку ошибок сам добавь


Polevi   (2002-08-23 18:10:00) [2]

type
TLogFile=class
private
fMaxFileSize:Cardinal;
fHandle,fmHandle:THANDLE;
fBuffer:Pointer;
public
constructor Create(AFileName:string);
destructor Destroy;override;
procedure WriteText(AText:string);
end;


{ TLogFile }

constructor TLogFile.Create(AFileName: string);
var
fileSizeHigh:Cardinal;
begin
fMaxFileSize:=$100000; //1 mbyte
fHandle:=CreateFile(PChar("c:\test.txt"),GENERIC_READ or GENERIC_WRITE,
0,nil,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
SetFilePointer(fHandle,0,nil,FILE_END);
fmHandle:=CreateFileMapping(fHandle,nil,PAGE_READWRITE,0,fMaxFileSize,nil);
fBuffer:=MapViewOfFile(fmHandle,FILE_MAP_WRITE,0,0,0);
end;

destructor TLogFile.Destroy;
begin
UnmapViewOfFile(fBuffer);
CloseHandle(fmHandle);
SetEndOfFile(fHandle);
CloseHandle(fHandle);
inherited;
end;

procedure TLogFile.WriteText(AText: string);
var
fBytesWrite:Cardinal;
begin
AText:=AText+#13#10;
WriteFile(fHandle,PChar(AText)^,Length(AText),FBytesWrite,nil);
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
with TLogFile.Create("c:\test.txt") do
begin
WriteText("just a ");
WriteText("test");
Free;
end;
end;


Filat   (2002-08-23 16:16:00) [3]

Неужели такой трудный вопрос?
Коллеги, подскажите пожалуйста.
Попутно появился второй вопрос, как вести параллельно такой же файл, только шифруя его, может через потоки, но как?


Filat   (2002-08-21 20:17:00) [4]

Если поставить в код прощедуры CloseFile или system.CloseFile и т.д. то при обращении к ней вылазит Error I/O 103.
А так процедура работает, но не всегда освобождает файл, млин...
Может как-то можно через CreateFile и WriteFile?


Zaxar   (2002-08-21 16:55:00) [5]

Процедуры*
AssignFile - связать
Reset - открыть
Rewrite - создать
//---
Write(f,var); - писать
Read(f,var); - читать
//---
CloseFile - закрыть (Это обязательно,иначе будет твоя проблема)


Werewolfru   (2002-08-21 16:03:00) [6]

А кто же будет закрывать файл то? Closefile(fff);
Командой system.close(fff) ты только освободил память, занятую файлом, а файл надо закрыфвать отдельно.

А лог можно вести с помошью OpenFile в моде ReadWrite, при этом если файл не существует, то он создается, если же существует, то информация дописывается в конец.


Наверх

Титульная страница Поиск, карта сайта Написать письмо