Man kann sich ja einfach mal den Code des LoadFromFile vornehmen und dort den Dateizugriff anpassen.
In diesem Fall also OPEN_EXISTING durch OPEN_ALWAYS ersetzen und zusätzlich auch den Schreibzugriff zu aktivieren (siehe SaveToFile).
https://docs.microsoft.com/en-us/win...#CREATE_ALWAYS
Delphi-Quellcode:
uses System.RTLConsts;
procedure TForm9.FormCreate(Sender: TObject);
var
FN:
string;
SL: TStringList;
FS:
{TFileStream}THandleStream;
FH: THandle;
begin
FN := ChangeFileExt(Application.ExeName, '
.txt');
SL := TStringList.Create;
try
ForceDirectories(ExtractFileDir(FN));
FH := CreateFile(PChar(FN), GENERIC_READ
or GENERIC_WRITE, FILE_SHARE_READ,
nil,
{OPEN_EXISTING}OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL
or FILE_FLAG_SEQUENTIAL_SCAN, 0);
if FH = INVALID_HANDLE_VALUE
then
//RaiseLastOSError;
raise EFCreateError.CreateFmt(SFCreateErrorEx, [ExpandFileName(FN), SysErrorMessage(GetLastError)]);
try
FS := THandleStream.Create(FH);
// hatte der HandleStream nicht mal ein "Owns" und konnte das Handle dann selber freigeben?
try
SL.LoadFromStream(FS);
finally
FS.Free;
end;
finally
CloseHandle(FH);
end;
//...
SL.SaveToFile(FN);
finally
SL.Free;
end;
end;
Alternativ alles zufammenfassen und daraus nur eine "Prüfung" bauen.
Delphi-Quellcode:
procedure TForm9.FormCreate(Sender: TObject);
var
FN: string;
SL: TStringList;
FH: THandle;
begin
FN := ChangeFileExt(Application.ExeName, '.txt');
SL := TStringList.Create;
try
ForceDirectories(ExtractFileDir(FN));
FH := CreateFile(PChar(FN), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ, nil,
{OPEN_EXISTING}OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN, 0);
if FH = INVALID_HANDLE_VALUE then
//RaiseLastOSError;
raise EFCreateError.CreateFmt(SFCreateErrorEx, [ExpandFileName(FN), SysErrorMessage(GetLastError)]);
CloseHandle(FH);
SL.LoadFromFile(FN);
//...
SL.SaveToFile(FN);
finally
SL.Free;
end;
end;
Der FileHandle (FH) und FileStream (FS) ließen sich auch bis zum Ende behalten und direkt zum Schreiben benutzen.
Da kann zwischendrin auch nicht die Datei, bzw. das Schreibrecht und das Sharingrecht verschwieden, weil es die ganze Zeit bestehen bleibt.
Delphi-Quellcode:
procedure TForm9.FormCreate(Sender: TObject);
var
FN:
string;
SL: TStringList;
FS:
{TFileStream}THandleStream;
FH: THandle;
begin
FN := ChangeFileExt(Application.ExeName, '
.txt');
SL := TStringList.Create;
try
ForceDirectories(ExtractFileDir(FN));
FH := CreateFile(PChar(FN), GENERIC_READ
or GENERIC_WRITE, FILE_SHARE_READ,
nil,
{OPEN_EXISTING}OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL
or FILE_FLAG_SEQUENTIAL_SCAN, 0);
if FH = INVALID_HANDLE_VALUE
then
//RaiseLastOSError;
raise EFCreateError.CreateFmt(SFCreateErrorEx, [ExpandFileName(FN), SysErrorMessage(GetLastError)]);
try
FS := THandleStream.Create(FH);
try
SL.LoadFromStream(FS);
//...
FS.Position := 0;
FS.Size := 0;
// oder nach dem Speichern ein Truncate
SL.SaveToStream(FS);
//FS.Truncate; // gibt es nicht, aber Size zuweisen geht ja auch, sowie auch über das Handle
// also FS.Size := FS.Position;
// oder SetEndOfFile(FH);
finally
FS.Free;
end;
finally
CloseHandle(FH);
end;
finally
SL.Free;
end;
end;