Microsoft KB Archive/35509: Difference between revisions
m (Text replacement - "<" to "<") |
m (Text replacement - "&" to "&") |
||
(One intermediate revision by the same user not shown) | |||
Line 12: | Line 12: | ||
<div id="TitleRow"> | <div id="TitleRow"> | ||
= <span id="KB35509"></span>Macintosh Directory List & | = <span id="KB35509"></span>Macintosh Directory List & File Search Across Folders/Drives = | ||
Line 74: | Line 74: | ||
DIM SHARED IOPB%(60) | DIM SHARED IOPB%(60) | ||
' stack globals | ' stack globals | ||
DIM SHARED stack$(20), dS& | DIM SHARED stack$(20), dS&(20), iS%(20), top% | ||
' globals for refresh | ' globals for refresh | ||
DIM SHARED nr%(3) 'file name rectangle | DIM SHARED nr%(3) 'file name rectangle | ||
Line 80: | Line 80: | ||
'-------------------------------------------------------- | '-------------------------------------------------------- | ||
' set up variables and draw window | ' set up variables and draw window | ||
w% = 395 : h% = 80 'window width & | w% = 395 : h% = 80 'window width & height | ||
SetRect nr%(0),10,30,w%-10,h%-10 | SetRect nr%(0),10,30,w%-10,h%-10 | ||
l% = (SYSTEM(5)-w%)\2 :t% = (SYSTEM(6)-h%)\4 | l% = (SYSTEM(5)-w%)\2 :t% = (SYSTEM(6)-h%)\4 | ||
Line 136: | Line 136: | ||
SUB Find( s$, found% ) STATIC | SUB Find( s$, found% ) STATIC | ||
ChangeCursor 4 :SHOWCURSOR | ChangeCursor 4 :SHOWCURSOR | ||
ptr& | ptr& = &H352 'pointer to default Volume Control Block | ||
vol& | vol& = PEEKL(ptr&) | ||
found% = FALSE | found% = FALSE | ||
WHILE vol& | WHILE vol&<>0 AND NOT found% | ||
' follow pointers through list of mounted volumes | ' follow pointers through list of mounted volumes | ||
vol& | vol& = PEEKL(ptr&) :ptr& = vol& | ||
IF vol& | IF vol&<>0 THEN 'null pointer at end of list | ||
' get volume name and initialize IOPB% | ' get volume name and initialize IOPB% | ||
dirID& | dirID& = 0 | ||
n$ = "" | n$ = "" | ||
vRefNum% = PEEKW(vol& | vRefNum% = PEEKW(vol& + 78) | ||
GetCatInfo IOPB%(0), n$, dirID& | GetCatInfo IOPB%(0), n$, dirID&, vRefNum% | ||
' search volume | ' search volume | ||
initStack | initStack | ||
push n$, dirID& | push n$, dirID&, 1 | ||
WHILE top% | WHILE top% >= 0 AND NOT found% | ||
dir ok%,iS%(top%),dS& | dir ok%,iS%(top%),dS&(top%),n$,directory% | ||
IF ok% THEN | IF ok% THEN | ||
iS%(top%) = iS%(top%) + 1 | iS%(top%) = iS%(top%) + 1 | ||
IF directory% THEN | IF directory% THEN | ||
dirID& | dirID& = PEEKL(VARPTR(IOPB%(24))) | ||
push n$, dirID& | push n$, dirID&, 1 | ||
ELSE | ELSE | ||
IF UCASE$(n$) = UCASE$(s$) THEN | IF UCASE$(n$) = UCASE$(s$) THEN | ||
Line 173: | Line 173: | ||
WEND | WEND | ||
END IF 'vol& | END IF 'vol& <> 0 | ||
WEND 'vol& | WEND 'vol& <> 0 | ||
INITCURSOR | INITCURSOR | ||
END SUB | END SUB | ||
Line 181: | Line 181: | ||
' dir | ' dir | ||
' | ' | ||
' Produces a listing of the directory specified by dirID& | ' Produces a listing of the directory specified by dirID&. | ||
' | ' | ||
' Start repeated calls to dir, starting with index% = 1. | ' Start repeated calls to dir, starting with index% = 1. | ||
Line 191: | Line 191: | ||
' ok% = -1 if more files/directories, 0 if no more | ' ok% = -1 if more files/directories, 0 if no more | ||
' index% = index | ' index% = index | ||
' dirID& | ' dirID& = directory ID number | ||
' n$ = file/directory name | ' n$ = file/directory name | ||
' directory% = -1 if directory, 0 if a file | ' directory% = -1 if directory, 0 if a file | ||
Line 198: | Line 198: | ||
' such as the creator and file type. See Inside Macintosh Vol. 4 | ' such as the creator and file type. See Inside Macintosh Vol. 4 | ||
' | ' | ||
SUB dir( ok%, index%, dirID& | SUB dir( ok%, index%, dirID&, n$, directory% ) STATIC | ||
n$ = STRING$(32,0) 'maximum simple file name | n$ = STRING$(32,0) 'maximum simple file name | ||
POKEL VARPTR(IOPB%(9)), SADD(n$) 'init string pointer | POKEL VARPTR(IOPB%(9)), SADD(n$) 'init string pointer | ||
IOPB%(14) = index% 'set index | IOPB%(14) = index% 'set index | ||
POKEL VARPTR(IOPB%(24)),dirID& | POKEL VARPTR(IOPB%(24)),dirID& 'set directory ID | ||
HFSDispatch 9,IOPB%(0) 'GetCatInfo | HFSDispatch 9,IOPB%(0) 'GetCatInfo | ||
ok% = IOPB%(8) = 0 'check result code ( 0 = noErr ) | ok% = IOPB%(8) = 0 'check result code ( 0 = noErr ) | ||
IF ok% THEN | IF ok% THEN | ||
n$ = MID$( n$, 2, ASC(n$) ) '- | n$ = MID$( n$, 2, ASC(n$) ) '-> BASIC string | ||
' set directory flag (attributes, bit 4) | ' set directory flag (attributes, bit 4) | ||
directory% = ( PEEK(VARPTR(IOPB%(15))) AND 16 ) = 16 | directory% = ( PEEK(VARPTR(IOPB%(15))) AND 16 ) = 16 | ||
Line 221: | Line 221: | ||
END SUB | END SUB | ||
SUB push( x$, l& | SUB push( x$, l&, i% ) STATIC | ||
IF top% | IF top%>UBOUND(stack$) THEN BEEP :PRINT "Stack overflow" :END | ||
top% = top% + 1 | top% = top% + 1 | ||
stack$(top%) = x$ | stack$(top%) = x$ | ||
dS& | dS&(top%) = l& | ||
iS%(top%) = i% | iS%(top%) = i% | ||
END SUB | END SUB |
Latest revision as of 14:14, 21 July 2020
Article ID: 35509
Article Last Modified on 1/9/2003
APPLIES TO
- Microsoft QuickBasic Compiler for Macintosh 1.0
This article was previously published under Q35509
SUMMARY
Macintosh QuickBASIC version 1.00 includes library routines (MBLC resources) called GetCatInfo and HFSDispatch that let you do the following:
- Search for filenames through all the folders (directories) on all currently mounted disk (drive) volumes
- Produce a listing of the files in a given folder
However, to effectively use GetCatInfo and HFSDispatch takes careful scrutiny of "Inside Macintosh," by Apple Computer, Inc. (published by Addison-Wesley). HFSDispatch is described in Volume 4 of "Inside Macintosh" and should be used only by advanced Macintosh Toolbox programmers.
The sample program "Find File" below shows how to use the GetCatInfo and HFSDispatch library routines. For another example of using GetCatInfo, please see the GetPathName subprogram in the Utility Subprograms source file on the Macintosh QuickBASIC version 1.00 Examples disk in the QB Demos folder.
MORE INFORMATION
' "Find File" ' File search example program. ' Copyright 1988-1991 Microsoft Corp. ' Written in Microsoft QuickBASIC Version 1.00 for Apple Macintosh. ' Microsoft makes no claims about support for or performance of ' this example program. ' [4/23/91 Program corrected in three places per SR# S890831-4, and ' should now work ok.] ' globals DIM SHARED TRUE, FALSE FALSE = 0 :TRUE = NOT FALSE ' i/o parameter block (see Inside Macintosh Vol. 4) DIM SHARED IOPB%(60) ' stack globals DIM SHARED stack$(20), dS&(20), iS%(20), top% ' globals for refresh DIM SHARED nr%(3) 'file name rectangle '-------------------------------------------------------- ' set up variables and draw window w% = 395 : h% = 80 'window width & height SetRect nr%(0),10,30,w%-10,h%-10 l% = (SYSTEM(5)-w%)\2 :t% = (SYSTEM(6)-h%)\4 WINDOW 1,"Find File",(l%,t%)-(l%+w%,t%+h%),6 refresh TEXTFONT 3 :EDIT FIELD 1,"",(54,7)-(w%-70,21),5 '-------------------------------------------------------- WHILE 1 'main event loop d% = DIALOG(0) SELECT CASE d% CASE 0 'do nothing CASE 4 :END 'window closed: quit CASE 5 :refresh 'refresh CASE 6 'carriage return pressed in edit field TEDEACTIVATE WINDOW(6) 'disable the edit field t$ = EDIT$(1) 'get file name to look for TextBox "", nr%(0), 0 find t$,found% IF found% THEN BEEP ELSE BEEP:BEEP:t$ = t$ + " Not Found" TextBox t$, nr%(0), 0 TEACTIVATE WINDOW(6) 'enable the edit field TESETSELECT 0,32767,WINDOW(6) 'select all CASE ELSE 'ignore anything else END SELECT WEND END '-------------------------------------------------------- ' refresh ' Draw window contents ' SUB refresh STATIC LINE (54,6)-(WINDOW(2)-69,22),,b InsetRect nr%(0), -2,-2 FRAMERECT VARPTR(nr%(0)) InsetRect nr%(0), 2,2 TEXTFONT 0 :TEXTFACE 0 MOVETO 10,18 :drawText "Find:" TEXTFONT 3 END SUB '-------------------------------------------------------- ' Find ' ' Find first file with simple name s$. ' returns found% = -1 if found, else 0. ' s$ = full path name if found ' ' This program searches alphabetically through the ' file system, descending each directory as it is ' encountered until a case-insensitive match is found. ' Searching stops at the first match. ' SUB Find( s$, found% ) STATIC ChangeCursor 4 :SHOWCURSOR ptr& = &H352 'pointer to default Volume Control Block vol& = PEEKL(ptr&) found% = FALSE WHILE vol&<>0 AND NOT found% ' follow pointers through list of mounted volumes vol& = PEEKL(ptr&) :ptr& = vol& IF vol&<>0 THEN 'null pointer at end of list ' get volume name and initialize IOPB% dirID& = 0 n$ = "" vRefNum% = PEEKW(vol& + 78) GetCatInfo IOPB%(0), n$, dirID&, vRefNum% ' search volume initStack push n$, dirID&, 1 WHILE top% >= 0 AND NOT found% dir ok%,iS%(top%),dS&(top%),n$,directory% IF ok% THEN iS%(top%) = iS%(top%) + 1 IF directory% THEN dirID& = PEEKL(VARPTR(IOPB%(24))) push n$, dirID&, 1 ELSE IF UCASE$(n$) = UCASE$(s$) THEN s$ = n$ :getPath s$ found% = TRUE END IF END IF ELSE 'finished searching this directory pop 'go back to where we left off END IF WEND END IF 'vol& <> 0 WEND 'vol& <> 0 INITCURSOR END SUB '-------------------------------------------------------- ' dir ' ' Produces a listing of the directory specified by dirID&. ' ' Start repeated calls to dir, starting with index% = 1. ' Repeat calls to dir (incrementing index% each time) until ' dir returns 0 (False) in ok%. ' For each call, dir returns the name of the file or directory in ' n$. ' ' ok% = -1 if more files/directories, 0 if no more ' index% = index ' dirID& = directory ID number ' n$ = file/directory name ' directory% = -1 if directory, 0 if a file ' ' Could be modified to return more information about the file ' such as the creator and file type. See Inside Macintosh Vol. 4 ' SUB dir( ok%, index%, dirID&, n$, directory% ) STATIC n$ = STRING$(32,0) 'maximum simple file name POKEL VARPTR(IOPB%(9)), SADD(n$) 'init string pointer IOPB%(14) = index% 'set index POKEL VARPTR(IOPB%(24)),dirID& 'set directory ID HFSDispatch 9,IOPB%(0) 'GetCatInfo ok% = IOPB%(8) = 0 'check result code ( 0 = noErr ) IF ok% THEN n$ = MID$( n$, 2, ASC(n$) ) '-> BASIC string ' set directory flag (attributes, bit 4) directory% = ( PEEK(VARPTR(IOPB%(15))) AND 16 ) = 16 END IF END SUB '-------------------------------------------------------- ' stack utilities ' assume OPTION BASE 0 ' SUB initStack STATIC top% = -1 END SUB SUB push( x$, l&, i% ) STATIC IF top%>UBOUND(stack$) THEN BEEP :PRINT "Stack overflow" :END top% = top% + 1 stack$(top%) = x$ dS&(top%) = l& iS%(top%) = i% END SUB ' We never need popped contents in this program, so pop just ' decrements the stack pointer. SUB pop STATIC IF top% < 0 THEN BEEP :PRINT "StringStack underflow" :END top% = top% - 1 END SUB '-------------------------------------------------------- ' getPath ' Prepend colon-separated stack contents to p$ ' without changing the stack. ' SUB getPath( p$ ) STATIC FOR j% = top% TO 0 STEP -1 :p$ = stack$(j%) + ":" + p$ :NEXT END SUB
Additional query words: MQuickB
Keywords: KB35509