PDA

View Full Version : سوال: کار با یک فایل مرکب



if
یک شنبه 23 آبان 1389, 11:07 صبح
سلام
اول بگم که تا جائی که میشد هم تو فروم سرچ کردم هم توی اینترنت.بیشتر ازین وقت بهم اجازه نمیداد مجبور شدم مزاحم شما دوستان بشم.
مشکل من اینجاست که قراره بخشی از محتویات یک فایل را تغییر بدم.هم با نحوه کار با فایلهای نوع دار آشنا هستم و هم فایلهای بدون نوع.اما متاسفانه این فایلی که دارم ترکیبی از یک فایل تکست و یک فرمت تصویری که فکر میکنم jpeg است میباشد.خوب بخشی از تصویر باز کردن فایل توسط notepad را قرار دادم.من میخواهم در قسمت تکست فایل که در ابتدای فایل هست یک تغییر در حد جابجائی دو متن بین کاماها ایجاد کنم ولی نمیدانم که میشود این تغییر را مستقیم در این فایل ایجاد کرد و یا اینکه باید از ابتدا فایل را بخونم و در یک فایل دیگر کپی کنم و در وسط انتقال تغییرات را اعمال کنم.از همه بدتر اینکه اگه با فایل از نوع تکست برخورد بکنم فقط قسمت ابتدای فایل را میتونم بخونم و اگر بخوام باینری فایل را منتقل کنم یکم تشخیص و تغییر محتویات مورد نظر سخت میشود.
و حالا از شما اساتید میخوام یک راه حل ترجیحا با یک نمونه کد ارائه بدید.
ممنون

http://www.irupload.ir/images/6na3d251ruslu93hsaip.jpg

Mahmood_M
یک شنبه 23 آبان 1389, 17:06 عصر
باید از نحوه ی ترکیب این دو فایل اطلاعاتی داشته باشیم ، مثلا چند بایت اولش متنه و باقیش فایل تصویری ؟ ، اصلا چرا همچین ترکیبی ایجاد میکنید ؟

vcldeveloper
یک شنبه 23 آبان 1389, 18:05 عصر
یک Memory Stream ایجاد کنید، و فایل رو در داخل اون لود کنید. کد زیر یک فایل رو باز میکنه، و با فرض اینکه ابتدای فایل متن هست، بایت اول فایل (در صورت ANSI بودن) یا دو بایت اول فایل (یونیکد) را به کارکتر S تغییر میده:


var
S : TMemoryStream;
p : pchar;
FileName : string;
begin
FileName := 'g:\myfile.txt';
S := TMemoryStream.Create;
try
S.LoadFromFile(FileName);
p := S.Memory;
p[1] := 's';
S.SaveToFile(FileName);
finally
S.Free;
end;
end;

if
یک شنبه 23 آبان 1389, 22:16 عصر
ممنون از راهنمائی اساتید و توجه به سوالات ابتدائی

باید از نحوه ی ترکیب این دو فایل اطلاعاتی داشته باشیم ، مثلا چند بایت اولش متنه و باقیش فایل تصویری ؟ ، اصلا چرا همچین ترکیبی ایجاد میکنید ؟ والا من هم ازش اطلاع کاملی ندارم.این فایل مربوط به یک برنامه نوشته شده برای یک ارگان دولتی است که به سبب سهل انگاری برنامه نویس محترم و اشتباه اپراتور بنده مجبورم حدود 2000 فایل مشکل دار را اصلاح کنم وگر نه باید 2000 نفر را فراخوان کرد :لبخند:
اینکه حتی نحوه و روش اصلاح به چه صورت باید باشد را هم خودم با سعی و خطا و استفاده از winhex بدست آوردم.ولی حتما بخشی از فایل تصویر میباشد و اینکه چرا هر دو با هم ترکیب شده اند بنده بی اطلاعم.در ضمن برنامه با دلفی 7 نوشته شده و تقریبا میشه گفت این فایل هم توسط خود برنامه نویس بطور مستقیم ایجاد نشده بلکه بواسطه کامپوننت اسکن تولید شده است.

یک Memory Stream ایجاد کنید، و فایل رو در داخل اون لود کنید. کد زیر یک فایل رو باز میکنه، و با فرض اینکه ابتدای فایل متن هست، بایت اول فایل (در صورت ANSI بودن) یا دو بایت اول فایل (یونیکد) را به کارکتر S تغییر میده:
جناب آقای کشاورز فقط یک سوال قبل از پیاده کردن نظر شما و اونم اینکه memory stream ها محدودیت فضا ندارند و یا اینکه قابل کنترل وتعریفند ؟ مثلا برای لود فایل تا چه حجمی میتوان از آنها بدون دغدغه استفاده کرد ؟

vcldeveloper
یک شنبه 23 آبان 1389, 23:51 عصر
جناب آقای کشاورز فقط یک سوال قبل از پیاده کردن نظر شما و اونم اینکه memory stream ها محدودیت فضا ندارند و یا اینکه قابل کنترل وتعریفند ؟ مثلا برای لود فایل تا چه حجمی میتوان از آنها بدون دغدغه استفاده کرد ؟
محدودیتش میزان فضای آزاد از فضای مجازی آدرس Process در حال اجرا ست. پس اونقدر هست که به مشکل برنخورید. البته طبیعی هست که در صورت لود کردن فایل های بسیار بزرگ، بهزمان بیشتری برای لود شدن نیاز هست. MemoryStream کل فایل رو در حافظه لود میکنه.

اگر نمیخواد این کار صورت بگیره، حالت دیگه این هست که فایل رو FileStream باز کنید، و از ابتدا تا آدرس مورد نظرتون رو در یک FileStream دیگه کپی کنید. سپس تغییرات مورد نظرتان را در انتهای FileStream دوم بنویسید، و در نهایت، مابقی داده ها را از FileStream اول به FileStream دوم کپی کنید. این کار از RAM کمتر استفاده میکنه، ولی به اندازه حجم فایل مورد نظرتون باید فضای خالی روی هارد دیسک داشته باشید، و البته سرعتش هم کمتر هست.