Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.05;
Скачать: CL | DM;

Вниз

CreateFile и WriteFile?   Найти похожие ветки 

 
Filat ©   (2002-08-21 14:50) [0]

Привет 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? + с возможностью дозаписывать в файл. Необходимо вести лог программы, чего она делает.
Заранее благодарен.


 
Werewolfru ©   (2002-08-21 16:03) [1]

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

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


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

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


 
Filat ©   (2002-08-21 20:17) [3]

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


 
Filat ©   (2002-08-23 16:16) [4]

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


 
Polevi ©   (2002-08-23 18:10) [5]

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;


 
Polevi ©   (2002-08-23 18:18) [6]

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



Страницы: 1 вся ветка

Текущий архив: 2002.09.05;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.012 c
7-14295
kingdom
2002-06-24 20:18
2002.09.05
Как остановить сервис из сервиса


1-14021
Сергей76
2002-08-26 12:57
2002.09.05
Кроссворд


3-13935
Flamer
2002-08-13 16:43
2002.09.05
Списки


1-14078
***
2002-08-27 10:33
2002.09.05
InstallShield


7-14300
Timon
2002-06-25 13:27
2002.09.05
WM_KEYDOWN