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);
War es hilfreich?

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')
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top