Solved

Checking if a drive is ready for access?

Posted on 1998-11-01
8
199 Views
Last Modified: 2010-04-06
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!
0
Comment
Question by:Kmiller
  • 3
  • 3
  • 2
8 Comments
 
LVL 3

Expert Comment

by:philipleighs
ID: 1345316
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
 

Author Comment

by:Kmiller
ID: 1345317
how would this be done when you only have the drive letter? Say M:\ which is a cdrom drive.
0
 
LVL 3

Expert Comment

by:philipleighs
ID: 1345318
//'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
Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

 
LVL 4

Expert Comment

by:dwwang
ID: 1345319
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
 

Author Comment

by:Kmiller
ID: 1345320
Thanks! They both seem to work... someone answer for credit.
0
 
LVL 4

Accepted Solution

by:
dwwang earned 100 total points
ID: 1345321
Sorry for others ^_^
0
 
LVL 3

Expert Comment

by:philipleighs
ID: 1345322
Hmm,

Don't you think the first answer is the one that deserves the credit?
0
 
LVL 4

Expert Comment

by:dwwang
ID: 1345323
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

Featured Post

Active Directory Webinar

We all know we need to protect and secure our privileges, but where to start? Join Experts Exchange and ManageEngine on Tuesday, April 11, 2017 10:00 AM PDT to learn how to track and secure privileged users in Active Directory.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

A lot of questions regard threads in Delphi.   One of the more specific questions is how to show progress of the thread.   Updating a progressbar from inside a thread is a mistake. A solution to this would be to send a synchronized message to the…
Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
A short tutorial showing how to set up an email signature in Outlook on the Web (previously known as OWA). For free email signatures designs, visit https://www.mail-signatures.com/articles/signature-templates/?sts=6651 If you want to manage em…
In an interesting question (https://www.experts-exchange.com/questions/29008360/) here at Experts Exchange, a member asked how to split a single image into multiple images. The primary usage for this is to place many photographs on a flatbed scanner…

828 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question