回 帖 发 新 帖 刷新版面

主题:[原创]一个老问题:搜索文件(包含子目录名)

'这个问题我在论坛发过帖子
'现在这个帖子找不到了
'这是重新优化过的过程
'CALL absolute 过程是由QB45提供的
'这个过程能够搜索到当前路径下的所有文件名及子目录名(不管文件什么属性)
'如果在根目录,也能够获得分区的卷标名

DEFINT A-Z
FUNCTION Dirs$ (Path AS STRING, Attr AS INTEGER, Size as LONG)
'******************************************************
'  搜索目录下的所有文件和文件夹,适用7.1和4.5版本
'  Attr位 8=卷标 16=目录 其他为文件
'  第一次调用时Path为要搜索的路径,第二次调用时Path请置空
'  返回:Attr=文件属性  Size=文件长度
'******************************************************
STATIC Lc AS INTEGER
STATIC ErrCode AS INTEGER
STATIC FileDATA AS STRING * 44
STATIC FirstCode AS STRING * 28
STATIC NextCode AS STRING * 18
STATIC FileName AS STRING * 64
IF Lc = 0 THEN
      Lc = 1
      DIM AsmCode AS STRING * 12
      '=================================================================
      MID$(AsmCode, 1, 3) = CHR$(&H68) + MKI$(VARSEG(FileDATA))
      MID$(AsmCode, 4, 1) = CHR$(&H1F)
      MID$(AsmCode, 5, 3) = CHR$(&HBA) + MKI$(VARPTR(FileDATA))
      MID$(AsmCode, 8, 2) = CHR$(&HB4) + CHR$(&H1A)
      MID$(AsmCode, 10, 2) = CHR$(&HCD) + CHR$(&H21)
      MID$(AsmCode, 12, 1) = CHR$(&HCB)
      '=================================================================
   
      DEF SEG = VARSEG(AsmCode): CALL ABSOLUTE(VARPTR(AsmCode)): DEF SEG
      '=================================================================
      MID$(FirstCode, 4, 1) = CHR$(&H1F)
      MID$(FirstCode, 8, 3) = CHR$(&HB8) + CHR$(&H0) + CHR$(&H4E)
      MID$(FirstCode, 11, 3) = CHR$(&HB9) + MKI$(255)
      MID$(FirstCode, 14, 2) = CHR$(&HCD) + CHR$(&H21)
      MID$(FirstCode, 16, 3) = CHR$(&H68) + MKI$(VARSEG(ErrCode))
      MID$(FirstCode, 19, 1) = CHR$(&H1F)
      MID$(FirstCode, 20, 2) = CHR$(&H72) + CHR$(&H2)
      MID$(FirstCode, 22, 2) = CHR$(&H33) + CHR$(&HC0)
      MID$(FirstCode, 24, 1) = CHR$(&H3E)
      MID$(FirstCode, 25, 3) = CHR$(&HA3) + MKI$(VARPTR(ErrCode))
      MID$(FirstCode, 28, 1) = CHR$(&HCB)
      
      '=================================================================
      MID$(NextCode, 1, 3) = CHR$(&HB8) + CHR$(&H0) + CHR$(&H4F)
      MID$(NextCode, 4, 2) = CHR$(&HCD) + CHR$(&H21)
      MID$(NextCode, 6, 3) = CHR$(&H68) + MKI$(VARSEG(ErrCode))
      MID$(NextCode, 9, 1) = CHR$(&H1F)
      MID$(NextCode, 10, 2) = CHR$(&H72) + CHR$(&H2)
      MID$(NextCode, 12, 2) = CHR$(&H33) + CHR$(&HC0)
      MID$(NextCode, 14, 1) = CHR$(&H3E)
      MID$(NextCode, 15, 3) = CHR$(&HA3) + MKI$(VARPTR(ErrCode))
      MID$(NextCode, 18, 1) = CHR$(&HCB)
      '=================================================================
END IF

IF Path$ <> "" THEN
      FileName = Path + CHR$(0)

      MID$(FirstCode, 1, 3) = CHR$(&H68) + MKI$(VARSEG(FileName))
      MID$(FirstCode, 5, 3) = CHR$(&HBA) + MKI$(VARPTR(FileName))

      DEF SEG = VARSEG(FirstCode)
      CALL ABSOLUTE(VARPTR(FirstCode)): DEF SEG

      IF ErrCode THEN EXIT FUNCTION
ELSE

      DEF SEG = VARSEG(NextCode)
      CALL ABSOLUTE(VARPTR(NextCode)): DEF SEG

      IF ErrCode THEN EXIT FUNCTION
END IF

File$ = MID$(FileDATA, 31)
Dirs$ = LEFT$(File$, INSTR(File$, CHR$(0)) - 1)
Attr% = ASC(MID$(FileDATA, 22, 1))
Size& = CVL(MID$(FileDATA, 27, 4))
END FUNCTION

回复列表 (共16个回复)

11 楼

我晕,你改是好,但是你不要改坏了,改后要调试一下
有时用MID$=()和用ASM$=ASM$+是不同的
取偏移地址时要用不用的函数,但有时也是一样的
用MID$便于阅读,因边一行就是一条汇编指令

12 楼

哈哈,你不知道mid$()=这一句是我让盖茨放进QB系统里面去的?哈哈.
你说还能有谁比我更清楚这一句的功能了?

13 楼

哎,偏偏有MOZ你这样的人,你看。。。
改成这样多难看,多混乱,眼都花了
真的是惨不忍睹

14 楼

哈哈,别这样子嘛,
你没发现在我发的源程序里面
关键字都是大写的?

你把它们放进QB里面你就知道如何简洁的了.
最起码省略了一大堆难看重复的mid,哈哈

15 楼

to MOZ:
你不要乱改,改好要调试一下
因为二种方式有点不同
再说:
MID$=“” 是一行一句汇编语句
给你一改就难看懂了

16 楼

[em10][em10][em10][em10][em10][em10]
遇到你这种死古板的人
真没话说

我来回复

您尚未登录,请登录后再回复。点此登录或注册