{
From: GUY MCLOUGHLIN
Subj: Checking file open

I'm looking for a way of detecting if a file is currently open,
so my ExitProc can close it when open and not fail when trying
to close a file that is not open.

              (* Public-domain demo to check a file variable's        *)
              (* current file mode. Guy McLoughlin - Oct '93.         *)
}

program Test_FileMode_Demo;
uses
 dos;

  (**** Display current filemode for a file variable.                 *)
  (*                                                                  *)
  procedure DisplayFileMode({input } const fi_IN);
  begin
    case textrec(fi_IN).mode of
      FMclosed : writeln('* File closed');
      FMinput  : writeln('* File open in read-only  mode');
      FMoutput : writeln('* File open in write-only mode');
      FMinout  : writeln('* File open in read/write mode')
    else
      writeln('* File not assigned')
    end
  end;        (* DisplayFileMode.                                     *)


  (**** Check for IO file errors.                                     *)
  (*                                                                  *)
  procedure CheckForIOerror;
  var
    in_Error : integer;
  begin
    in_Error := ioresult;
    if (ioresult <> 0) then
      begin
        writeln('Error creating file');
        halt(1)
      end
  end;        (* CheckForIOerror.                                     *)


var
  fi_Temp1 : text;
  fi_Temp2 : file;

BEGIN
              (* Demo filemodes for a TEXT file variable.             *)
  writeln('TEXT file variable test');
  DisplayFileMode(fi_Temp1);
  assign(fi_Temp1, 'TEST.DAT');
  DisplayFileMode(fi_Temp1);
  {$I-} rewrite(fi_Temp1); {$I+}
  CheckForIOerror;
  DisplayFileMode(fi_Temp1);
  {$I-} close(fi_Temp1); {$I+}
  CheckForIOerror;
  DisplayFileMode(fi_Temp1);

              (* Demo filemodes for an UNTYPED file variable.         *)
  writeln;
  writeln('UNTYPED file variable test');
  DisplayFileMode(fi_Temp2);
  assign(fi_Temp2, 'TEST.DAT');
  DisplayFileMode(fi_Temp2);
  {$I-} rewrite(fi_Temp2); {$I+}
  CheckForIOerror;
  DisplayFileMode(fi_Temp2);
  {$I-} close(fi_Temp2); {$I+}
  CheckForIOerror;
  DisplayFileMode(fi_Temp2)
END.

  *** NOTE: If you are not using version 7 of Turbo Pascal, change
            the input parameter of the DisplayFileMode routine from
            a CONSTANT parameter to a VAR parameter.

              ie: TP7+ : DisplayFileMode({input } const fi_IN);

                  TP4+ : DisplayFileMode({input } var fi_IN);

                               - Guy
