Verifica che il file sia aperto in Delphi
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);
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')