PDA

View Full Version : نوشتن و خواندن اطلاعت در فایل !!!!



fire-wizard
یک شنبه 23 دی 1386, 19:14 عصر
سلام بچه ها .


یک مشکلی دارم که مدتها هست ذهنم رو مشغول خودش کرده .... :گیج:



شما فرض کنید دو تا برنامه نوشتید که یکی وضیفه ی نوشتن در دیگری رو داره و اون یکی وضیفه ی خوندن اطلاعاتی که توش نوشته شده رو داره .


الان من کد مربوط به برنامه ای که وضیفه ی نوشتن در دیگری رو داره براتون میزارم تا ببینید .




var
Form1: TForm1;

implementation

{$R *.dfm}

var
HF:HFile;
Mdata:Record
Check:string[15];
Sendpass:boolean;
Regstart:boolean;
Id:string[80];

end;



function Encode(st:string):string;
var i:integer;
begin
result:='';
if st='' then exit;
for i:=1 to length(st) do st[i]:=chr(ord(st[i]) XOR 128);
result:=st;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin

With Mdata do
begin
Check:=Encode('Test');
Sendpass:=CheckBox1.Checked;
Regstart:=CheckBox2.Checked;
Id:=Encode(Edit2.Text);
end;

HF:= CreateFile(pchar('Myfile.exe'), GENERIC_WRITE,FILE_SHARE_READ,nil,
OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE, 0);

FileSeek(HF,GetFileSize(HF,NIL),FILE_BEGIN);
FileWrite(HF,Mdata,SizeOf(Mdata));
CloseHandle(HF);
MessageBox(Form1.Handle, pchar('Created Successfuly...'),pchar('.:: Creator ::.'),MB_ICONINFORMATION);
end;






این کد یک رکورد Record رو که شامل یک سری مقادیر هست توی Myfile.exe ( فایل خواننده ) مینویسه .



البته مقادیر اول توسط تابع Encode کد گذاری میشن .


حالا کد برنامه ی خواننده ی اطلاعات ( فایل Myfile.exe ) رو براتون میزارم تا ببینید .



var
Form1: TForm1;
implementation
{$R *.dfm}
var
Mdata:Record
Check:string[15];
Sendpass:boolean;
Regstart:boolean;
Id:string[80];
end;
function Decode(st:string):string;
var i:integer;
begin
result:='';
if st='' then exit;
for i:=1 to length(st) do st[i]:=chr(ord(st[i]) XOR 128);
result:=st;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
HF : HFile;
begin
HF:= CreateFile(pchar(ParamStr(0)), GENERIC_READ, FILE_SHARE_READ or
FILE_SHARE_WRITE, nil,OPEN_EXISTING, 0, 0);
FileSeek(HF,GetFileSize(HF,NIL)-SizeOf(Mdata),FILE_BEGIN);
FileRead(HF,Mdata,SizeOf(Mdata));
CloseHandle(HF);
if Decode(Mdata.Check)='Test' then begin
if Mdata.Sendpass then Label3.Caption:='Enabled'
else Label3.Caption:='Disabled';
if Mdata.RegStart then Label4.Caption:='Enabled'
else Label4.Caption:='Disabled';
Label6.Caption:=Decode(Mdata.Id);
Label7.Caption:='Config Loaded Successfuly';
end
else Label7.Caption:='Config Data not found';
end;



توسطاین کد اطلاعات نوشته شده در فایل Myfile.exeتوسط خود فایل خونده میشه ( البته اول از حالت کد گذاری شده در میاد )





تا اینجاش که هیچ مشکلی نfود و به راحتی اطلاعات خودنده و نوشته میشد .








حالا من میام یک متغیر دیگه همه به رکوردی که نوشته میشه اظافه میکنم تا در برنامه خواننده بتونم اون رو هم بخونوم و کدم به شکل زیر در میاد .






var
Form1: TForm1;
implementation
{$R *.dfm}
var
HF:HFile;
Mdata:Record
Check:string[15];
Sendpass:boolean;
Regstart:boolean;
Id:string[80];
file1:TFileStream;
end;

function Encode(st:string):string;
var i:integer;
begin
result:='';
if st='' then exit;
for i:=1 to length(st) do st[i]:=chr(ord(st[i]) XOR 128);
result:=st;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
With Mdata do
begin
Check:=Encode('Test');
Sendpass:=CheckBox1.Checked;
Regstart:=CheckBox2.Checked;
Id:=Encode(Edit2.Text);
file1:=TFileStream.Create('C:\img.jpg',fmOpenRead) ;
end;
HF:= CreateFile(pchar('Myfile.exe'), GENERIC_WRITE,FILE_SHARE_READ,nil,
OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE, 0);
FileSeek(HF,GetFileSize(HF,NIL),FILE_BEGIN);
FileWrite(HF,Mdata,SizeOf(Mdata));
CloseHandle(HF);
MessageBox(Form1.Handle, pchar('Created Successfuly...'),pchar('.:: Creator ::.'),MB_ICONINFORMATION);
end;




خوب طبیعتا باید فایل img.jpg هم همراه با رکورد توی Myfile.exe نوشته بشه مگه نه ؟؟؟




خوب حالا باید کد فایل خوانده ی اطلاعات Myfile.exe رو چه جوری تغییر بدم که علاوه بر اطلاعات قبلی این فایل هم از توی خودش بخونه ؟؟؟؟







دوستان لطفا در این زمینه راهنمایی کنن .... با تشکر .... :بامزه:

Arman_1367
یک شنبه 23 دی 1386, 20:45 عصر
با سلام
ببین دوست عزیز اگر من بخواهم یک همچین کاری بکنم و اطلاعات یک فایل را هم ته برنامه اضافه کنم داخل رکورد یک قسمت Cardinal می زارم که سایز اون داده جریانی یا Stream را داره و در هنگام نوشتن در فایل ابتدا اون داده جریانی را در فایل می نویسم بعد سایزش رو تو رکورد گذاشته و اون را می نویسم برای خوندنش هم کافیه بعد از خوندن رکورد به اندازه سایز Stream Seek می کنم و بعد Stream را پر می کنم همین.اگر نتونستی کدشو بنویسی بگو تا یک مثال ساده بزارم.

fire-wizard
یک شنبه 23 دی 1386, 21:25 عصر
اگه این لطف رو بکنی ممنون میشم !!!

Arman_1367
یک شنبه 23 دی 1386, 22:40 عصر
این یک مثال ساده از حرفی هست که زدم موفق باشید.