ورود

View Full Version : سوال: جلوگیری از پر شدن فایل از کارکتر صفر هنگام قطع برق



mbshareat
چهارشنبه 20 فروردین 1404, 11:58 صبح
سلام علیکم
من یک برنامه دارم که زود به زود فایلهای کوچک رو ذخیره می کنه.چنین کدی برای ذخیره دارم:
Procedure TFileBrowserForm.SaveStr(FileName:String;FileStr:S tring);Var
Stream : TFileStream;
Begin
Stream := TFileStream.Create(FileName,fmCreate);
TestFileStr(FileName,S);
try
Stream.Position := 0;
Stream.Write(FileStr[1],Length(FileStr));
finally
Stream.Free;
end;
End;

وقتی ویندوز قفل می کنه(فرض کنید پاور خرابه یا ویندوز سنگینه یا اشکال نرم افزاری پیش میاد) یا برق میره،
بارها کاربرها گزارش کرده اند که فایل و حتی بک آپش پر از کارکتر صفر شده اند.(خودم هم درگیرش شده ام)
واقعا نمی دونم ویندوز چه کار به بک آپ فایلها داره.:اشتباه:
در کد بالا TestFileStr(FileName,S) وجود کارکتر صفر رو بررسی می کنه و مانع ذخیره فایل با کارکتر صفر میشه.
چند سوال دارم که ممکنه برای درک/حل مشکل کمک کنه(به ترتیب اهمیت میگم):لبخندساده::
1)این سوال خیلی مهم به نظر نمیرسه..آیا Try..finally..end ممکنه موجب تاخیر ذخیره فایل بشه؟مثلا وقتی از پروسیجر خارج بشیم، هنوز فایل ذخیره نشده باشه؟
2)آیا ویندوز هم مثل برنامه ADM اندروید ، اول فایل با طول مشخص فاقد اطلاعات نهایی میسازه(مثلا پر از کارکتر صفر) بعد اطلاعات میریزه در فایل؟
3) من دو روش بدون استفاده از استریم دارم که میتونم جایگزین کنم. به نظرتون کمک می کنه؟
procedure TMainForm.SaveStr2(FileName:String;S:String);
Var
F:File;
begin
AssignFile(F,FileName);
ReWrite(F,1);
Seek(F,0);
BlockWrite(F,Pointer(S)^,Length(S));
CloseFile(F);
end;
procedure TMainForm.SaveStr3(FileName:String;S:String);
var
hFile : Integer;
begin
hFile := FileOpen(FileName, fmOpenReadWrite or fmShareDenyWrite);
if hFile > 0 then
try
if FileSeek(hFile,0,2) < 0 then
RaiseLastOSError;
if FileWrite(hFile, S[1],Length(S) * SizeOf(Char)) <= 0 then
RaiseLastOSError;
finally
FileClose(hFile);
end;
end;

سوال آخر برام مهمه. این برنامه دو سال هست که مشکل کارکتر صفر داره.چند جا بک آپ می گیرم و گاهی همه فایلها خراب میشند.
من فعلا برنامه رو تغییر دادم و از SaveStr2 استفاده می کنم.:لبخندساده:
اما اگر کسی میتونه کمک کنه خوبه.معمولا فایل پر از کارکتر صفر هست اما گاهی وسط فایل کارکتر صفر هست که به نظر میرسه مشکل از برنامه ام بوده. بهم گفتند کاربرها زیاد با قطعی برق مواجه میشند و می دونم که خیلیهاشون سیستم قدیمی دارند.

دلفــي
پنج شنبه 21 فروردین 1404, 08:04 صبح
مشکلاتی که در مورد خرابی فایل ها با آن مواجه هستید، به ویژه وجود کاراکترهای پوچ، می تواند از عوامل مختلفی ناشی شود:
ساختار try..finally تضمین می کند که منابع آزاد می شوند، اما ذاتا باعث تاخیر در نوشتن فایل نمی شود. با این حال، اگر سیستم تحت بار سنگین باشد یا وقفه هایی (مانند قطع برق) وجود داشته باشد، ممکن است فایل قبل از خروج برنامه به طور کامل نوشته نشود.
ویندوز معمولاً قبل از نوشتن داده، فایلی پر از کاراکترهای خالی ایجاد نمی کند و داده ها را مستقیماً در فایل می نویسد. با این حال، اگر یک عملیات نوشتن قطع شود، می تواند منجر به ذخیره ناقص اطلاعات شود.
روش‌های جایگزین شما (SaveStr2 و SaveStr3) ممکن است کنترل بیشتری بر روی نوشتن فایل فراهم کنند. استفاده از BlockWrite یا FileWrite می‌تواند کارآمدتر باشد و ممکن است به کاهش مشکلات مربوط به خرابی فایل‌ها کمک کند، به خصوص اگر استثناها را با ظرافت بیشتری مدیریت کنید.
برای محافظت بیشتر در برابر از دست دادن داده ها، پیاده سازی یک مکانیسم مدیریت خطا و احتمالاً استفاده از رویکرد فایل موقت را در نظر بگیرید که در آن ابتدا روی یک فایل موقت می نویسید و پس از تکمیل موفقیت آمیز، آن را به نام فایل نهایی تغییر نام می دهید. به این ترتیب می توانید از خراب شدن فایل اصلی در هنگام وقفه های غیرمنتظره جلوگیری کنید.

mbshareat
شنبه 23 فروردین 1404, 12:55 عصر
ممنون
روش من این هست که وقتی فایل رو بعد از بررسی فقدان کارکتر صفر می نویسم یک کپی با پسوند دیگه ازش می گیرم. اما وقتی ویندوز قفل می کنه یا مشکلات دیگه بارها دیده شده که هم فایل اصلی و هم فایل پشتیبان با پسوند دیگه خراب و از کارکتر اول فایل تا آخرین کارکتر، کارکتر صفر شده اند.