ممنون. این روش که استفاده کردم، فایل رو از حافظه خارج نمی کنه و مثل بعضی وقتها که نمی شه پوشه رو حذف کرد و نیاز به ریست یا برنامه خاص هست، فایل یه جایی در حافظه گیره؟
جدیدا متجه شدن که رشته میتونه با صفر شروع بشه و در فایل هم درست ذخیره بشه؛ اما اگر از 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 قبل از ذخیره فایل بدست میاد هم ناکار شده بود.