Checking if a drive is ready for access?

What is the best way to test if a drive is ready for access? This is needed for drives like cd-roms and jaz drives.

Thanks!
KmillerAsked:
Who is Participating?
 
dwwangCommented:
Sorry for others ^_^
0
 
philipleighsCommented:
Hi,

Here is a snippet of code that may help.
The important point is the SetErrorMode calls. Without these, (and when running outside Delphi), and when the a: drive is not ready you get a message saying "System error, drive not ready, Abort, Retry, Cancel.
The SetErrorMode supresses these error messages.
You can then call DiskFree. There may be something better than DiskFree, but if it returns -1 then the drive is not ready.

PrevErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS);
try
   if DiskFree(1) <> -1 then
      //A: Drive is ready
   else
      //A: drive is not ready
finally
  SetErrorMode(PrevErrorMode);
end;

0
 
KmillerAuthor Commented:
how would this be done when you only have the drive letter? Say M:\ which is a cdrom drive.
0
Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

 
philipleighsCommented:
//'A' or 'a' returns 1,
//'B' or 'b' returns 2 etc
function GetDriveNumber(Letter: Char): Integer;
begin
  Result := Ord(UpCase(Letter)) - Ord('A') + 1;
end;


begin
DiskFree(   GetDriveNumber('M')  );
.

Note if you have a string, you could also use GetDriveNumber like this:

s := 'M:\';
DiskFree(   GetDriveNumber(  s[1]  );

Cheers,
Phil.

PS: Tell me if you want code that tells you which drives(s) are CD-ROMs then I'll can paste it here.

0
 
dwwangCommented:
This one is from Inprise's FAQ, it does not need to use try..except.

function IsDriveReady(DriveLetter : char) : bool;
                    var
                      OldErrorMode : Word;
                      OldDirectory : string;
                    begin
                      OldErrorMode := SetErrorMode(SEM_NOOPENFILEERRORBOX);
                      GetDir(0, OldDirectory);
                      {$I-}
                        ChDir(DriveLetter + ':\');
                      {$I+}
                       if IoResult <> 0 then
                        Result := False
                       else
                        Result := True;

                      ChDir(OldDirectory);
                      SetErrorMode(OldErrorMode);
                    end;
0
 
KmillerAuthor Commented:
Thanks! They both seem to work... someone answer for credit.
0
 
philipleighsCommented:
Hmm,

Don't you think the first answer is the one that deserves the credit?
0
 
dwwangCommented:
Hi, I just happened to be notified by e-mail and come here to make an answer, if you care of that, now I just ask Kmiller to reject my answer.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.