[Back to DOS SWAG index] [Back to Main SWAG index] [Original]

    {
     some days ago, Bryan Ellis (gt6918b@prism.gatech.edu)
     asked how one could, in TP, check whether a disk in a
     drive is formatted or not. I did not see any answer on
     this posted to the list, so here comes an 'extract' from
     code of mine which might help.

    { The following two procedures were extracted from old file
     copy programs of mine; Therefore they should be 'cleaned-up'
     and fixed up before being included in somebody's code.
     The purpose of the first one is to ensure that:
        a) the target disk (to be written to) is indeed
     present in the drive;
        b) the target disk is a formatted one. If it is
     not, then opportunity is provided for formatting by
     shelling to DOS (rather clumsy, but you get the idea ;-)).

      The purpose of the second procedure is partly redundant
      with that of the first one. It checks whether the disk
      is present in the drive, and it also warns when the disk
      is write protected.
      Calls to ancillary procedures for putting the cursor onto
      the right column and row on the screen, or to clean up
      the display, save and restore the screen, or warning noises
      etc., were removed, which explains the somewhat desultory
      code, which I had no time to rewrite :-( }

      { uses DOS,CRT; }

    Procedure CheckDriv(driv : string; var OK:boolean;
           var cc:char   );
    {* driv is the string holding the letter of the drive;        *}
    {* OK is a global boolean var which must be true in order for  *}
    {* the rest of the program to proceed.          *}
    {* cc : checks input by the user          *}
    {***************************************************************}
    var IOR    : integer;
        jk,dr  : char;
        S    : string;
        CmdLine: PathStr;
    begin
      OK  := TRUE;
      IOR := 0;
    {$I-}
      ChDir(driv);   { make the target drive current }
      { the original current drive letter should be saved in order}
      { to be restored afterwards }
      dr := upcase(driv[1]);
      IOR := IOresult;
      if IOR = 152 then begin
        OK := FALSE;
        writeln('No disk in ',copy(driv,1,2));
        writeln(' (Insert a disk or press ESC)');
        repeat until keypressed;
        cc := readkey
      end
      else
      if IOR = 162 then begin
        OK := FALSE;
        writeln('Unformatted disk in ',copy(driv,1,2));
        writeln('Press ESC to cancel...');
        writeln('...or press ''*'' to format...');
        repeat until keypressed;
        cc := readkey;
        { here, for security sake, only drives A and B were taken
          into account for writing }
        if ((cc = '*') AND ((dr = 'A') OR (dd = 'B'))) then
          begin
     cc := chr(27);
     { now, your Format.com file had better be in the path! }
     S := FSearch('FORMAT.COM', GetEnv('PATH'));
     S := FExpand(S);
     CmdLine := copy(driv,1,2);
     SwapVectors;
     Exec(S,CmdLine);
     SwapVectors;
     If DosError <> 0 then
       write('Dos error #',DosError)
     else
       write('Press any key...');
     repeat until keypressed;
     jk := readkey;
          end
      end
    end;
    {$I+}

    Procedure CheckWrite(var FF: file;
           var OK: boolean;
           var cc: char);
    {*   Tests for presence of disk in drive and write protect tab, *}
    {*   to allow opening of untyped file for write: this file has *}
    {*   of course been assigned before, elsewhere in the program *}
    {****************************************************************}
    {$I-}
    var riteprot : boolean;
        DiskAbsent : boolean;
        error : integer;
    begin
      riteprot := TRUE;
      DiskAbsent := TRUE;
      rewrite(FF);
      error := IOResult;
      riteprot := error = 150;
      DiskAbsent := error = 152;
      if riteprot then begin
        writeln('Disk is write protected!');
        writeln('Correct the situation and press any key...');
        repeat until keypressed;
        cc := readkey
      end;
      if DiskAbsent then begin
        writeln('No disk in the drive!');
        writeln('Insert disk into drive, then press any key...');
        repeat until keypressed;
        cc := readkey
      end;
      OK := (Not(riteprot)) AND (Not(DiskAbsent))
    end;
    {$I+}

[Back to DOS SWAG index] [Back to Main SWAG index] [Original]