Microsoft KB Archive/72275

= How Basic Can Get Drive Label Using Interrupt or SHELL &quot;DIR&quot; =

Article ID: 72275

Article Last Modified on 11/21/2006

-

APPLIES TO


 * Microsoft QuickBasic 4.0
 * Microsoft QuickBASIC 4.0b
 * Microsoft QuickBasic 4.5 for MS-DOS
 * Microsoft BASIC Compiler 6.0
 * Microsoft BASIC Compiler 6.0b
 * Microsoft BASIC Professional Development System 7.0
 * Microsoft BASIC Professional Development System 7.1

-



This article was previously published under Q72275



SUMMARY
You can find the drive label for any drive (or floppy disk) from a Microsoft QuickBasic or Microsoft Basic Professional Development System (PDS) program. The following article gives examples of two methods for finding the drive label from a Basic program. The two methods are:


 * 1) Use Basic's SHELL statement to shell to DOS; then perform a DIR command while redirecting the directory information, which contains the label, into a file. Your program can then open and read this file to determine the drive label. -or-


 * 1) Use the Basic statement CALL INTERRUPT to call DOS interrupt 21 Hex functions to get a file-control block (FCB). A FCB contains the drive label as part of its information.

This information applies to Microsoft QuickBasic versions 4.00, 4.00b, and 4.50; to Microsoft Basic Compiler versions 6.00 and 6.00b for MS-DOS; and to Microsoft Basic Professional Development System (PDS) versions 7.00 and 7.10 for MS-DOS.



Method 1
To obtain the drive label, SHELL to DOS with the Basic SHELL statement and redirect the DIRectory information into a file. You can then read the file for the label information, which is on the second line of the file after the word &quot;is&quot;. The advantage of this method is that the coding is less complex than the code for using CALL INTERRUPT. The disadvantage of this method is that it is slower and uses more memory. Also, when you use the DIR command, if no files are available, a &quot;File not found&quot; message will print to the screen but not to the file. The sample provided below creates a DIR listing of the root drive to lessen the chance that no files will be found. ' SAMPLE PROGRAM to demonstrate how to use SHELL to get the drive ' label. SHELL &quot;DIR C:\ > temp.tmp&quot; OPEN &quot;temp.tmp&quot; FOR INPUT AS #1

' Read the first (blank) line from the file into a dummy variable. LINE INPUT #1, junk$

' Read the label information LINE INPUT #1, temp$

' Parse the label from the second line in the file. label$ = MID$(temp$,INSTR(temp$, &quot;is&quot;) + 3) PRINT &quot;The Label for Drive C: is &quot;; label$ CLOSE #1

'Delete directory file KILL &quot;temp.tmp&quot; END

Method 2
The second method of getting the directory information is to use Basic's CALL INTERRUPT statement to call DOS functions to get the drive label. The following example uses file-control blocks (FCBs) to get the drive label. Although using FCBs is an outdated method of handling files, FCBs are required to get the drive label information.

More information about DOS interrupts and file-control blocks is available in the Microsoft Press book &quot;Advanced MS-DOS Programming,&quot; by Ray Duncan. DEFINT A-Z ' Start QBX (or QB) with a /L to load QBX.QLB (or QB.QLB). ' The include file for QB is QB.BI ' The include file for QBX is QBX.BI REM $INCLUDE: 'QBX.BI'

TYPE XtendedFCB

ExtendedFCBFlag AS STRING * 1 Reserved1      AS STRING * 5 Attribute      AS STRING * 1 DriveId        AS STRING * 1 label          AS STRING * 11 UnUsedFCB      AS STRING * 25 UnUsedDTA      AS STRING * 84   'DTA should be 128 bytes

END TYPE DIM inregs AS RegTypeX DIM outregs AS RegTypeX DIM fcb AS XtendedFCB DIM DTA AS XtendedFCB

' set up Variables for change: DIM Drive AS STRING * 1 Drive = CHR$(0)  'set drive to 0=current, 1 = A, 2 = B, 3 = C, etc.

'save old DTA address: inregs.ax = &H2F00 CALL InterruptX(&H21, inregs, outregs) OLDDTASEG = outregs.es OLDDTAPTR = outregs.bx

'set new DTA address: inregs.ax = &H1A00 inregs.dx = VARPTR(DTA) inregs.ds = VARSEG(DTA) CALL InterruptX(&H21, inregs, outregs)

'Find the first file: the label fcb.ExtendedFCBFlag = CHR$(&HFF) fcb.DriveId = Drive

'Do a wildcard search *.* must have the correct spaces: fcb.label = &quot;*      *&quot; fcb.Attribute = CHR$(8) inregs.ax = &H1100 inregs.dx = VARPTR(fcb) inregs.ds = VARSEG(fcb) CALL InterruptX(&H21, inregs, outregs)

' PRINT label: PRINT DTA.label

'Reset OLD DTA address: inregs.ax = &H1A00 inregs.dx = OLDDTAPTR inregs.ds = OLDDTASEG CALL InterruptX(&H21, inregs, outregs)

Additional query words: QuickBas BasicCom

Keywords: KB72275

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.