PDA

View Full Version : سوال: خراب شدن فایل با قطع برق



mbshareat
سه شنبه 06 دی 1401, 18:43 عصر
سلام خدمت دوستان
یه مدت هست یه مشکل جدی در فایلهایی که از یک برنامه تایپ استفاده می کنند پیش میاد.
معمولا هنگام قطع برق پیش میاد اما گزارش شده که در حال کار عادی هم پیش اومده.
برنامه با فشار هر کلید فاصله و همچنین بعضی کارهای دیگه هم فایل رو ذخیره می کنه و هم پشتیبان میگیره.
مشکلی که پیش میاد این هست که گاهی کل فایل با کارکتر صفر پر میشه و دیده شده که انتهای فایل خراب میشه. مثلا چند روز پیش یه لحظه برق کم و زیاد شد، یه فایل 25 کیلو بایتی شد 31 بایت(در انتهای هر فایل کارکتر & وجود داره و در قسمتی از برنامه کارکترهای انتهای فایل بعد از اون رو که فاصله یا انتهای سطر باشند(عملا غیر مفید)، خودکار حذف می کنم).
نمی دونم چرا محتوای فایل تغییر می کنه. شاید بتونم هر پنج دقیقه یک فایل موقت درست کنم(مثل کاری که مایکروسافت ورد می کنه) اما مطمئن نیستم که آیا تایمر در عمل برنامه اخلال ایجاد می کنه یا نه ولی در هر صورت مشکل اینطوری حل نمیشه.
خیلی پیش شخصی به من گفت چرا وقتی برنامه دیگری روی مجموعه از فایلها کار کرده ولی هنوز برنامه رو نبسته ایم، فایلها قفل هستند.(چون خیلی پیش بود یادم نمیاد میخواست با برنامه فایل باز کنه یا حذف کنه یا چه کاری بود)
می ترسم فایل اخیری که برنامه روش کار می کنه به نحوی هنوز بسته نشده باشه و باقطع برق، محتواش خراب بشه.چون فقط فایل جاری خراب میشد.
من با چنین کدی فایل رو ذخیره می کنم:
If MakeBackup=True then
BackUp(CurFileName);
AssignFile(F,CurFileName);
ReWrite(F,1);
Seek(F,0);
BlockWrite(F,Pointer(FileStr)^,Length(FileStr));
CloseFile(F);


نمی دونم تغییر نحوه ذخیره اطلاعات متن فایل کمکی می کنه؟ آیا بهتره از فایل استریم یا FileOpen استفاده کنم یا نه؟

یوسف زالی
چهارشنبه 07 دی 1401, 01:55 صبح
سلام.
از فایل استریم استفاده کن

mbshareat
چهارشنبه 07 دی 1401, 19:17 عصر
ممنون. این روش که استفاده کردم، فایل رو از حافظه خارج نمی کنه و مثل بعضی وقتها که نمی شه پوشه رو حذف کرد و نیاز به ریست یا برنامه خاص هست، فایل یه جایی در حافظه گیره؟:اشتباه:
جدیدا متجه شدن که رشته میتونه با صفر شروع بشه و در فایل هم درست ذخیره بشه؛ اما اگر از TStringList برای باز کردن استفاده کنیم به مشکل بر می خوریم.فکر می کنم انتسابش به عنوان متن لیست باکس هم همین مشکل رو ایجاد می کنه و گویا رشته خالی بهش دادیم.
من دو روش برای ذخیره امتحان کردم که هیچکدوم مانع بازکردن و ویرایش فایل با برنامه دیگه و یا مانع جابجایی فایل به پوشه دیگه در حال باز بون برنامه نشدند(به روش اول باز کردن فایل گیر ندید.فایلی که باز می کنم فایل داس هست و انتهای سطر #13#10 نداره):
procedure LoadStr(FileName:String;var S:String);
var
St:TStrings;
begin
St:=TStringList.Create;
St.LoadFromFile(FileName);
S:=Copy(St.Text,1,Length(St.Text)-2);
St.free;
end;
procedure SaveStr(FileName,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 LoadStr2(FileName:String;Var S:String);
Var
Stream : TFileStream;
begin
Stream := TFileStream.Create(FileName,fmOpenRead);
try
Stream.Position := 0;
SetLength(S,Stream.Size);
Stream.Read(S[1], Stream.Size);
finally
Stream.Free;
end;
End;
Procedure SaveStr2(FileName:String;S:String);
Var
Stream : TFileStream;
Begin
Stream := TFileStream.Create(FileName,fmCreate);
try
Stream.Position := 0;
Stream.Write(S[1],Length(S));
finally
Stream.Free;
end;
End;
procedure TForm1.FormCreate(Sender: TObject);
Var
S:String;
begin
LoadStr('C:\A.txt',S);
SaveStr('C:\b.txt',S);
end;



دیدم در قسمتی از کد از StringList برای لود فایل استفاده کرده ام که تا بسته شدن برنامه آزاد نمیشه. میتونم کد رو تغییر بدم اما اتفاقی که نا امید کننده هست این هست که چند روز پیش حتی فایل پشتیبان که با CopyFile قبل از ذخیره فایل بدست میاد هم ناکار شده بود.