View Full Version : سوال: گرفتن چند بایت فایل به صورت یکجا
loo30fer
جمعه 18 شهریور 1390, 12:26 عصر
با سلام
من میخوام چندبایت فایلی رو به صورت یکجا بگیرم نه دونه دونه ولی هرچی با FileStream دست و پنجه نرم کردم و تست کردم نشد و وقتی هم که میشد تنها با فایلهای معمولی مثل txt میشد و وقتی میخواستم باهاش باینری فایلهای exe رو بگیرم فقط 3 بایت اولش که MZP هست رو میگیره حالا چیکار باید کرد چه روشها یا کامپوننتی وجود داره که قدرتش مانند FileStream باشه و قابلیتی مثل fmShareDenyNone رو هم داشته باشه.:متفکر:
ضمنا دلیل اینکه نمیخوام دونه دونه بایت رو بگیرم و از حلقه استفاده کنم پایین اومدن سرعت کارم هست.
ممنون میشم من رو در این زمینه راهنمایی کنید. پیشاپیش ازتون ممنونم.
Felony
جمعه 18 شهریور 1390, 13:50 عصر
نیازی به کامپوننت نیست و FileStream هم کامپوننت نسیت ، یک کلاسه !
پست شماره 47 این تاپیک (http://barnamenevis.org/showthread.php?209792-%D8%B3%D9%88%D8%B1%D8%B3%D9%87%D8%A7%D9%8A-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A2%D9%85%D9%88%D8%B2%D8%B4%D9%8A/page5) رو ببینید .
loo30fer
جمعه 18 شهریور 1390, 14:57 عصر
نیازی به کامپوننت نیست و FileStream هم کامپوننت نسیت ، یک کلاسه !این رو میدونم منظورم این بود که توابعی یا کامپوننتی باشه که قدرتش مانند FileStream باشه.
ضمنا فکر نمیکنم اینی که شما دادین اون چیزی باشه که من میخواستم آخه مقداری از فایل رو میگیره و اون مقدار تو خود FileStream ریخته میشد و سپس توی یک فایل دیگر ولی من میخوام مثلا 200 بایت اول رو بگیرم و توی یک متغیر رشته ای بگیرم و توی پیغام نشونش بدم از این کدم استفاده میکنم ولی باز فقط MZP رو میگیره و نمایش میده اگه امکان داره اشکال کدم رو بگین چون مطمئنا اشکال از کار خود بنده است. ممنون
procedure TForm1.Button1Click(Sender: TObject);
var
FileStream: TFileStream;
Buff: Array [0..200]of AnsiChar;
begin
FileStream:= TFileStream.Create('C:\Project1.exe', fmOpenRead or fmShareDenyNone);
FileStream.Seek(0, soFromBeginning);
FileStream.ReadBuffer(Buff,200);
ShowMessage(Buff);
end;
tdkhakpur
جمعه 18 شهریور 1390, 21:54 عصر
کدتان اشکال نداره showmessage رشته رو تاجایی که به 0 نرسیده میخونه و mzp آخرش 0 داره به همین خاطر همش همون رو نشون میده.
loo30fer
جمعه 18 شهریور 1390, 22:57 عصر
کدتان اشکال نداره showmessage رشته رو تاجایی که به 0 نرسیده میخونه و mzp آخرش 0 داره به همین خاطر همش همون رو نشون میده.
برای تست اومدم مستقیم مقداری رو که گرفته میشد رو توی یک فایل دیگه ریختم دیدم بله همینطور بود که شما فرمودین ولی حالا چرا وقتی مقدار متغیر Buff رو توی متغیر String میریزم تنها MZP رو میگیره؟
tdkhakpur
شنبه 19 شهریور 1390, 00:23 صبح
ولی حالا چرا وقتی مقدار متغیر Buff رو توی متغیر String میریزم تنها MZP رو میگیره؟
با چه ابزاری این کار رو انجام میدید? اگه از CopyMemory استفاده کنید میتوانید همه buff را کپی کنید.
در کل اگه نتیجه همانی هست گه میگید باز قضیه برمی گرده به همان nil یا همان صفری که آخر رشته قرار داره.
loo30fer
شنبه 19 شهریور 1390, 00:32 صبح
با چه ابزاری این کار رو انجام میدید? اگه از CopyMemory استفاده کنید میتوانید همه buff را کپی کنید.با کدی که نوشتم اینکار رو میکنم برای تست هم اومدم طول متغیر Get رو میگیرم میبینم 3 هست که باز همون MZP میشه.
procedure TForm1.Button1Click(Sender: TObject);
var
FileStream: TFileStream;
Buff: array [0..199]of AnsiChar;
Get: String;
begin
FileStream:= TFileStream.Create('C:\Project1.exe', fmOpenRead or fmShareDenyNone);
FileStream.Seek(0, soFromBeginning);
FileStream.ReadBuffer(Buff,200);
Get:= Buff;
FileStream.Free;
ShowMessage(IntToStr(Length(Get)));
end;
tdkhakpur
شنبه 19 شهریور 1390, 00:57 صبح
ببینید استفاده از ابزارهای استاندارد دلفی که از یه سری قوانین حمایت میکنه در این مورد نمیتونه به شما کمک کنه چون برای پردازش متون همیشه انتهای متن یا همان رشته رو از طریق همان 0 که آخر رشته قرار میگیره تشخیص میدن و موقعی که به nil یا 0 برسند کارشون رو تمام کرده و خروجی رو نشون میدن.
برای اینکه همه اون داده ها رو بتونید نمایش بدید باید خودتان یک showmessage بنویسید که همه کاراکترها رو تک تک نشون بده.
Felony
شنبه 19 شهریور 1390, 06:42 صبح
کد زیر رو ببینید :
var
FileStream: TFileStream;
Bytes: TBytes;
i: Integer;
begin
FileStream := TFileStream.Create('FileName', fmOpenRead or fmShareDenyWrite);
try
if FileStream.Size > 0 then
begin
SetLength(Bytes, FileStream.Size);
FileStream.Read(Bytes[0], FileStream.Size);
for i := 0 to High(Bytes) do
if Char(Bytes[i]) = #0 then
ShowMessageFmt('#0 Founded at %s', [IntToStr(i)])
else
ShowMessage(Char(Bytes[i]));
end;
finally
FileStream.Free;
end;
end;
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.