回 帖 发 新 帖 刷新版面

主题:[讨论]不用中断不用shell不用/l的文件目录处理

看到71做的文件目录和45做的中断调用,
我也忍不住手弄了一个来
主要利用的是files命令
因为利用的是屏幕显示,有几个局限:

0. 做的是文件列表选择功能
   源文件就在这里了,随便你们喜欢怎样利用怎样改都行了.
1. 单个目录中文件数量过多的时候只对后面的20*4=88个文件名有效,这也是屏幕显示的局限


DEFINT A-Z
FUNCTION FilesSelect$
lenofname = 16
GOSUB dirfilename
DO
  onoff = 0
  IF x > 0 AND y > 0 AND x < 26 AND y < 73 THEN IF SCREEN(x, y) <> 45 OR SCREEN(x, y + 8) = 46 THEN onoff = onoff + 1
  IF onoff = 1 THEN
   DEF SEG = &HB800
   addofscr = ((xx - 1) * 80 + yy - 1) * 2 + 1
   FOR iofadd = addofscr TO (addofscr + lenofname * 2) STEP 2
    POKE iofadd, 135
   NEXT
   addofscr = ((x - 1) * 80 + y - 1) * 2 + 1
   FOR iofadd = addofscr TO (addofscr + lenofname * 2) STEP 2
    POKE iofadd, 18
   NEXT
   DEF SEG
   xx = x
   yy = y
  ELSE
   x = xx
   y = yy
   BEEP
  END IF
  DO: k$ = INKEY$: LOOP WHILE k$ = ""
  SELECT CASE k$
  CASE CHR$(0) + CHR$(72): x = x - 1
  CASE CHR$(0) + CHR$(80): x = x + 1
  CASE CHR$(0) + CHR$(75): y = y - 2 - lenofname
  CASE CHR$(0) + CHR$(77): y = y + 2 + lenofname
  CASE CHR$(0) + CHR$(73), CHR$(0) + CHR$(81): x = 1: y = 1
  CASE CHR$(13)
       f$ = ""
       FOR yi = y TO (y + lenofname)
           si = SCREEN(x, yi)
           IF si > 45 THEN f$ = f$ + CHR$(si)
       NEXT
       IF RIGHT$(f$, 5) = "<DIR>" THEN
          CHDIR LEFT$(f$, INSTR(1, f$, "<") - 1)
          GOSUB dirfilename
       ELSE
          FilesSelect$ = f$
          EXIT DO
       END IF
  CASE CHR$(8)
       CHDIR ".."
       GOSUB dirfilename
  CASE CHR$(0) + CHR$(59)
       CHDIR "\"
       GOSUB dirfilename
  CASE ELSE
  END SELECT
LOOP UNTIL k$ = CHR$(27)

COLOR 7, 0
CLS
EXIT FUNCTION

dirfilename:
  COLOR 23, 0
  CLS
  FILES
  LOCATE CSRLIN - 1, 1
  PRINT STRING$(80, 45);
  x = 1
  y = 1
  xx = 1
  yy = 1
RETURN
END FUNCTION

回复列表 (共3个回复)

沙发

目的嘛是搜索文件名
那就再做一个搜索文件的东西来吧,
还是有很多局限:

1. 因为利用的是files命令
   还是得通过屏幕显示(黑屏操作)
   调用完要记得恢复color

2. 因为屏幕显示的原因,
   还是某目录最后88个文件有效搜索

3. 内存耗用比较大
   例程中可以用到一千多个
   可以做到逐层搜索
   理论上最大应该可以达到四万多个目录项


DECLARE FUNCTION FindFile$ (f$)
DECLARE FUNCTION Tongpei! (a$, b$)
a$ = FindFile$("readme.txt")
b$ = FindFile$("")
c$ = FindFile$("")

COLOR 7, 0
CLS
PRINT a$
PRINT b$
PRINT c$
system

DEFINT A-Z
FUNCTION FindFile$ (f$)
STATIC paths$(), pathn, lenofname, x, y, findto$
IF findto$ <> UCASE$(f$) OR pathn = 0 THEN
  pathn = 1000
  REDIM paths$(pathn)
  CHDIR "\"
  pathn = 0
  paths$(pathn) = CURDIR$
  findto$ = UCASE$(f$)
  lenofname = 16
  x = 1
  y = 1
END IF
DO WHILE pathn < 1000
  COLOR 0, 0
  CLS
  FILES
  LOCATE CSRLIN - 1, 1
  PRINT SPACE$(80);
  DO WHILE x < 26
    DO WHILE y < 73

       fread$ = ""
       FOR yi = y TO (y + lenofname)
           si = SCREEN(x, yi)
           IF si > 45 THEN fread$ = fread$ + CHR$(si)
       NEXT

       IF Tongpei(fread$, findto$) THEN
          FindFile$ = paths$(0) + findto$
          y = y + 18
          EXIT FUNCTION
       ELSEIF RIGHT$(fread$, 5) = "<DIR>" AND LEFT$(fread$, 1) <> "." THEN
          pathn = pathn + 1
          paths$(pathn) = paths$(0) + LEFT$(fread$, INSTR(fread$, "<") - 1)
       ELSEIF fread$ = "" THEN
          hong = hong + 1
          IF hong > 4 THEN
             x = 25
             y = 80
             hong = 0
          END IF
       END IF
       y = y + 18
    LOOP
    x = x + 1
    y = 1
  LOOP
IF paths$(2) <> "" THEN
   pathn = pathn - 1
   FOR i = 1 TO pathn
     paths$(i) = paths$(i + 1)
   NEXT
     paths$(i) = ""

   CHDIR paths$(1)
   paths$(0) = CURDIR$
   IF RIGHT$(paths$(0), 1) <> "\" THEN paths$(0) = paths$(0) + "\"
   x = 1
   y = 1
ELSE
   EXIT DO
END IF
LOOP
END FUNCTION

DEFSNG A-Z
FUNCTION Tongpei (a$, b$)
IF a$ = b$ THEN
   Tongpei = -1
ELSE
     bi = INSTR(b$, ".")
   IF bi THEN
     bb$ = LEFT$(LEFT$(b$, bi - 1) + SPACE$(8), 8) + MID$(b$ + SPACE$(3), bi, 4)
   ELSE
     bb$ = LEFT$(b$ + SPACE$(8), 8) + ".???"
   END IF
     bi = INSTR(bb$, "*")
   IF bi > 0 AND bi < 9 THEN MID$(bb$, bi, 9 - bi) = "????????"
     bi = INSTR(10, bb$, "*")
   IF bi > 9 THEN MID$(bb$, 10, 3) = "???"

      bi = INSTR(a$, ".")
   IF bi THEN
      aa$ = LEFT$(LEFT$(a$, bi - 1) + SPACE$(8), 8) + MID$(a$ + SPACE$(3), bi, 4)
   ELSE
      aa$ = LEFT$(a$ + SPACE$(8), 8) + ".   "
   END IF
      aa$ = UCASE$(aa$)
      bb$ = UCASE$(bb$)
   FOR i = 1 TO 12
      IF MID$(aa$, i, 1) <> MID$(bb$, i, 1) AND MID$(bb$, i, 1) <> "?" THEN EXIT FOR
   NEXT
   IF i > 12 THEN Tongpei = -1
END IF
END FUNCTION

板凳

好长,好难,好晕

3 楼

好垃圾、好人、好放屁!

我来回复

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