Do you think the following PBCC5 code would be faster if files are parsed for the search string as they are encountered instead of waiting until all the directories are found?
Code:
#COMPILE EXE #BREAK ON DEFLNG A - Z %Normal = &B000000 FUNCTION PBMAIN() LOCAL SrchStr AS STRING LOCAL Extns AS STRING LOCAL CurDrv AS STRING * 1 LOCAL Curntdir AS STRING LOCAL A AS STRING LOCAL Drvs() AS STRING LOCAL ExtnAry() AS STRING LOCAL SrchRes() AS STRING LOCAL Sz AS LONG DIM SrchRes$(1 TO 1) SrchStr$ = "postmessage" Extns$ = ".txt,.bas,.inc,.bi,.rc,.rtf,.htm,.php" CurntDir$ = CURDIR$ CurDrv = CurntDir$ Sz = 1 J = 0 FOR I = ASC("A") TO ASC("Z") A$ = CHR$(I) ON ERROR GOTO DrvErr CHDRIVE A$ INCR J REDIM PRESERVE Drvs$(1 TO J) Drvs$(J) = A$ + ":\" ErClear: ' NEXT I GOTO ParseExtns DrvErr: ' ERRCLEAR RESUME ErClear ParseExtns: ' ON ERROR GOTO 0 CHDRIVE CurDrv$ CHDIR CurntDir$ Extns$ = UCASE$(Extns$) SrchStr$ = UCASE$(SrchStr$) M = PARSECOUNT(Extns$, ",") REDIM ExtnAry(1 TO M) PARSE Extns$, ExtnAry$(), "," t = TIMER I = 1 J = UBOUND(Drvs$) DO IF I > J THEN EXIT DO ErCount = 0 Access_Clr1: ' ON ERROR GOTO Access_Err1 A$ = DIR$(Drvs$(I) + "*.*", 22) Access_Err1: ' IF ERR THEN IF ErCount > 1 THEN EXIT IF IF ERR = 70 THEN INCR ErCount PRINT Drvs$(I) + A$ PRINT ERR, ERROR$, ErCount, "error1" ERRCLEAR SETATTR Drvs$(I) + A$, %NORMAL IF ISFALSE ERR THEN RESUME Access_Clr1 END IF END IF ON ERROR GOTO 0 IF A$ = "" THEN INCR I IF I > J THEN EXIT DO ITERATE DO END IF K = GETATTR(Drvs$(I) + A$) IF (K AND 16) = 16 THEN INCR J REDIM PRESERVE Drvs$(1 TO J) Drvs$(J) = Drvs$(I) + A$ + "\" END IF DO ErCount = 0 Access_Clr2: ' ON ERROR GOTO Access_Err2 A$ = DIR$(NEXT) Access_Err2: ' IF ERR THEN IF ErCount > 1 THEN EXIT IF IF ERR = 70 THEN INCR ErCount PRINT Drvs$(I) + A$ PRINT ERR, ERROR$, ErCount, "error2" ERRCLEAR SETATTR Drvs$(I) + A$, %NORMAL IF (ISFALSE ERR) AND (ErCount < 2) THEN RESUME Access_Clr3 ELSE ON ERROR GOTO 0 END IF END IF END IF Access_Clr3: ' ErCount = 0 ON ERROR GOTO 0 IF A$ = "" THEN INCR I EXIT DO END IF K = GETATTR(Drvs$(I) + A$) IF (K AND 16) = 16 THEN INCR J REDIM PRESERVE Drvs$(1 TO J) Drvs$(J) = Drvs$(I) + A$ + "\" END IF LOOP LOOP Sz = 0 FOR I = 1 TO J A$ = DIR$(Drvs$(I) + "*.*") IF A$ = "" THEN ITERATE FOR K_loop: ' A$ = UCASE$(A$) FOR K = 1 TO UBOUND(ExtnAry$) B$ = ExtnAry$(K) IF INSTR(-1, A$, B$) THEN A$ = Drvs$(I) + A$ ON ERROR GOTO Open_Err OPEN A$ FOR INPUT AS #1 DO WHILE NOT EOF(1) LINE INPUT #1, B$ B$ = UCASE$(B$) IF INSTR(B$, SrchStr$) THEN INCR Sz REDIM PRESERVE SrchRes$(1 TO Sz) SrchRes$(Sz) = A$ EXIT DO END IF LOOP Open_Err: ' IF ERR THEN PRINT ERR, ERROR$, "Open error" PRINT A$ ERRCLEAR ON ERROR GOTO 0 END IF CLOSE #1 EXIT FOR END IF NEXT K A$ = DIR$(NEXT) IF A$ = "" THEN EXIT IF ELSE GOTO K_loop END IF NEXT I PRINT TIMER - T PRINT "done" WAITKEY$ FOR I = 1 TO Sz PRINT SrchRes$(I) NEXT I PRINT "Files found = "; Sz PRINT "end" WAITKEY$ END FUNCTION SUB Ck_File(A$, Fdir$, ExAry$(), Srch$, SRes$(), Sz, Flg) LOCAL ExtSize AS LONG LOCAL SrcLen AS LONG LOCAL Src AS STRING LOCAL B AS STRING LOCAL Allowed AS STRING LOCAL Q AS STRING * 1 ExtSize = UBOUND(ExAry$) Src$ = UCASE$(Srch$) B$ = UCASE$(A$) FOR I = 1 TO ExtSize IF INSTR(-1, B$, ExAry$(I)) THEN GOTO Extn_Ok NEXT I EXIT SUB Extn_Ok: ' Allowed$ = " " + "(" + "=" SrcLen = LEN(Src$) ' OPEN Fdir$ + A$ FOR INPUT AS #1 DO WHILE NOT EOF(1) LINE INPUT #1, B$ B$ = UCASE$(B$) I = INSTR(B$, Src$) IF I THEN IF Flg THEN IF I = 1 THEN B$ = LEFT$(B$, SrcLen + 1) Q = B$ IF INSTR(Allowed$, Q) = 0 THEN ITERATE DO Q$ = RIGHT$(B$, 1) IF INSTR(Allowed$, Q) = 0 THEN ITERATE DO PRINT B$ ELSE B$ = MID$(B$, I - 1, SrcLen + 2) Q = B$ IF INSTR(Allowed$, Q) = 0 THEN ITERATE DO Q$ = RIGHT$(B$, 1) IF INSTR(Allowed$, Q) = 0 THEN ITERATE DO PRINT B$ END IF END IF REDIM PRESERVE Sres$(1 TO Sz) Sres$(Sz) = Fdir$ + A$ INCR Sz EXIT DO END IF LOOP CLOSE #1 END SUB
Comment