Comprobando archivo está abierto en Delphi
Pregunta
¿Hay alguna forma de verificar si ReWrite ha abierto un archivo en Delphi?
El código sería algo como esto:
AssignFile(textfile, 'somefile.txt');
if not textFile.IsOpen then
Rewrite(textFile);
Solución
Puedes obtener el modo de archivo. (En un momento crearé un ejemplo).
TTextRec (txt). El modo te da el modo:
55216 = closed
55217 = open read
55218 = open write
fmClosed = $D7B0;
fmInput = $D7B1;
fmOutput = $D7B2;
fmInOut = $D7B3;
Busque TTextRec en la unidad del sistema para obtener más información.
Otros consejos
Prueba esto:
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;
Esto funciona bien:
function IsOpen(const txt:TextFile):Boolean;
const
fmTextOpenRead = 55217;
fmTextOpenWrite = 55218;
begin
Result := (TTextRec(txt).Mode = fmTextOpenRead) or (TTextRec(txt).Mode = fmTextOpenWrite)
end;
Me resultó más fácil mantener una variable booleana como acompañante; ejemplo: bFileIsOpen
. Donde sea que se abra el archivo, establezca bFileIsOpen: = true
luego, cuando necesite saber si el archivo está abierto, solo pruebe esta variable; ejemplo: if (bFileIsOpen) luego Close (archivo de datos);
La respuesta de Joseph funciona perfectamente. Llamé a la función filenotopen
y cambié la línea si
Result := (HFileRes = INVALID_HANDLE_VALUE);
a
Result := NOT (HFileRes = INVALID_HANDLE_VALUE);
También eliminé la línea 'si no (Resultado) luego comience' (y el 'final') para que SIEMPRE cierre el identificador o las asignaciones subsiguientes y las lecturas den errores
Ahora lo llamo así
if filenotopen(filename) then
begin
assignfile(f,filename);
reset(f)
etc;
end
else
message('file open by a different program')