Domanda

C'è un modo per verificare se un file è stato aperto da ReWrite in Delphi?

Il codice sarebbe simile a questo:

AssignFile(textfile, 'somefile.txt');
if not textFile.IsOpen then
   Rewrite(textFile);
È stato utile?

Soluzione

È possibile ottenere la modalità file. (Un momento, creerò un esempio).

TTextRec (txt) .Mode ti dà la modalità:

55216 = closed
55217 = open read
55218 = open write

fmClosed = $D7B0;
fmInput  = $D7B1;
fmOutput = $D7B2;
fmInOut  = $D7B3;

Cerca TTextRec nell'unità di sistema per ulteriori informazioni.

Altri suggerimenti

Prova questo:

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;

Funziona bene:

function IsOpen(const txt:TextFile):Boolean;
const
  fmTextOpenRead = 55217;
  fmTextOpenWrite = 55218;
begin
  Result := (TTextRec(txt).Mode = fmTextOpenRead) or (TTextRec(txt).Mode = fmTextOpenWrite)
end;

Ho trovato più facile mantenere una variabile booleana come compagna; esempio: bFileIsOpen . Ovunque venga aperto il file, imposta bFileIsOpen: = true quindi, ogni volta che devi sapere se il file è aperto, prova questa variabile; esempio: if (bFileIsOpen) quindi Close (datafile);

La risposta di Joseph funziona perfettamente - ho chiamato la funzione filenotopen e ho cambiato la riga se

Result := (HFileRes = INVALID_HANDLE_VALUE);

a

Result := NOT (HFileRes = INVALID_HANDLE_VALUE);

Ho anche rimosso la riga 'if not (Risultato), quindi inizia' (e la 'fine') in modo che chiuda SEMPRE l'handle o le assegnazioni successive e legga dare errori

Ora lo chiamo così

if filenotopen(filename) then 
  begin
    assignfile(f,filename);
    reset(f)
    etc;
  end
else
  message('file open by a different program')
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top