Datei-Checking ist Open in Delphi
Frage
Gibt es eine Möglichkeit zu überprüfen, ob eine Datei neu schreiben in Delphi geöffnet wurde?
-Code würde wie folgt gehen:
AssignFile(textfile, 'somefile.txt');
if not textFile.IsOpen then
Rewrite(textFile);
Lösung
Sie können den Dateimodus erhalten. (Ein Moment, ich werde ein Beispiel erstellen).
TTextRec (txt) .mode gibt Ihnen den Modus:
55216 = closed
55217 = open read
55218 = open write
fmClosed = $D7B0;
fmInput = $D7B1;
fmOutput = $D7B2;
fmInOut = $D7B3;
Suchen TTextRec in der Systemeinheit für weitere Informationen.
Andere Tipps
Versuchen Sie folgendes:
function IsFileInUse(fName: string) : boolean;
var
HFileRes: HFILE;
begin
Result := False;
if not FileExists(fName) then begin
Exit;
end;
HFileRes := CreateFile(PChar(fName)
,GENERIC_READ or GENERIC_WRITE
,0
,nil
,OPEN_EXISTING
,FILE_ATTRIBUTE_NORMAL
,0);
Result := (HFileRes = INVALID_HANDLE_VALUE);
if not(Result) then begin
CloseHandle(HFileRes);
end;
end;
Dies funktioniert:
function IsOpen(const txt:TextFile):Boolean;
const
fmTextOpenRead = 55217;
fmTextOpenWrite = 55218;
begin
Result := (TTextRec(txt).Mode = fmTextOpenRead) or (TTextRec(txt).Mode = fmTextOpenWrite)
end;
Ich fand es einfacher, eine boolean Variable als Begleiter zu halten; Beispiel: bFileIsOpen
. Überall dort, wo die Datei geöffnet wird, eingestellt bFileIsOpen := true
dann, wenn Sie wissen müssen, wenn die Datei geöffnet ist, nur diese Variable testen; Beispiel: if (bFileIsOpen) then Close(datafile);
Josephs Antwort funktioniert perfekt - Ich rief die Funktion filenotopen
und änderte die Zeile, wenn
Result := (HFileRes = INVALID_HANDLE_VALUE);
Result := NOT (HFileRes = INVALID_HANDLE_VALUE);
Ich entfernte auch die Linie ‚wenn nicht (Ergebnis), dann beginnen‘ (und das ‚Ende‘), so dass er immer die Griff oder nachfolgende Zuweisungen schließt und liest Fehler geben
Ich nenne es jetzt wie folgt aus
if filenotopen(filename) then
begin
assignfile(f,filename);
reset(f)
etc;
end
else
message('file open by a different program')