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 استفاده می کنم.:لبخندساده:
اما اگر کسی میتونه کمک کنه خوبه.معمولا فایل پر از کارکتر صفر هست اما گاهی وسط فایل کارکتر صفر هست که به نظر میرسه مشکل از برنامه ام بوده. بهم گفتند کاربرها زیاد با قطعی برق مواجه میشند و می دونم که خیلیهاشون سیستم قدیمی دارند.
من یک برنامه دارم که زود به زود فایلهای کوچک رو ذخیره می کنه.چنین کدی برای ذخیره دارم:
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 استفاده می کنم.:لبخندساده:
اما اگر کسی میتونه کمک کنه خوبه.معمولا فایل پر از کارکتر صفر هست اما گاهی وسط فایل کارکتر صفر هست که به نظر میرسه مشکل از برنامه ام بوده. بهم گفتند کاربرها زیاد با قطعی برق مواجه میشند و می دونم که خیلیهاشون سیستم قدیمی دارند.