【问题标题】:How to test if a directory exist in qbasic?如何测试qbasic中是否存在目录?
【发布时间】:2019-06-04 01:14:28
【问题描述】:

我正在用 Qbasic 编写程序。 我想知道如何测试文件夹是否存在。

想法是:

IF "c:\user\basic\blablabla\" exists (?? how to programm the "exist" test?)
THEN CHDIR "c:\user\basic\blablabla\"
ELSE 
MKDIR "c:\user\basic\blablabla\"
CHDIR "c:\user\basic\blablabla\"
ENDIF

我希望我足够清楚,

非常感谢您的建议!

:)

【问题讨论】:

  • QB64 有一个 _DIREXISTS() 函数。

标签: directory exists qbasic gw-basic


【解决方案1】:

尝试将目录更改为blablabla。如果它不存在,则会出现错误。捕获此错误并指定错误处理例程。

ON ERROR GOTO doesnotexist
CHDIR "c:\user\basic\blablabla\"
END

doesnotexist:
MKDIR "c:\user\basic\blablabla\"
CHDIR "c:\user\basic\blablabla\"
RESUME NEXT

【讨论】:

    【解决方案2】:

    如果记忆有用(有时没有):

    FolderExists = (Dir$("C:\User\basic\blahblahbla\nul") <> "")
    

    应该在支持 Dir$() 但不支持属性参数的旧版 BASIC 中工作。 NUL 设备假定存在于每个文件夹中,因此它是一种检查文件夹的方法,即使该文件夹为空。

    【讨论】:

    • QB中没有Dir$();仅 BC7(PDS) 和 VBDOS(v1.00)
    【解决方案3】:

    QB中存在另一种检测目录的方法:

    REM function to detect directory exists in QB pd 2019 ejo
    REM load QB /L QB.QLB
    TYPE DTAtype
     Drive AS STRING * 1
     SearchTemplate AS STRING * 11
     SearchAttr AS STRING * 1
     EntryCount AS STRING * 2
     ClusterNumber AS STRING * 2
     Reserved AS STRING * 4
     Filebits AS STRING * 1
     FileTime AS STRING * 2
     FileDate AS STRING * 2
     FileSize AS STRING * 4
     ASCIIZfilename AS STRING * 13
    END TYPE
    TYPE RegTypeX
     AX    AS INTEGER
     BX    AS INTEGER
     CX    AS INTEGER
     DX    AS INTEGER
     bp    AS INTEGER
     si    AS INTEGER
     di    AS INTEGER
     flags AS INTEGER
     DS    AS INTEGER
     ES    AS INTEGER
    END TYPE
    DECLARE SUB InterruptX (intnum AS INTEGER, inreg AS RegTypeX, outreg AS RegTypeX)
    DIM InregsX AS RegTypeX
    DIM OutregsX AS RegTypeX
    DIM DTAfile AS DTAtype
    DIM ASCIIZ AS STRING * 260
    DIM Current.DTA.SEG AS INTEGER
    DIM Current.DTA.OFF AS INTEGER
    PRINT "Enter directory";
    INPUT Filespec$
    ASCIIZ = Filespec$ + CHR$(0)
    ' store current dta
    InregsX.AX = &H2F00
    CALL InterruptX(&H21, InregsX, OutregsX)
    Current.DTA.SEG = OutregsX.ES
    Current.DTA.OFF = OutregsX.BX
    ' store function dta
    InregsX.AX = &H1A00
    InregsX.DS = VARSEG(DTAfile)
    InregsX.DX = VARPTR(DTAfile)
    CALL InterruptX(&H21, InregsX, OutregsX)
    ' findfirst
    InregsX.AX = &H4E00
    InregsX.CX = &H37
    InregsX.DS = VARSEG(ASCIIZ)
    InregsX.DX = VARPTR(ASCIIZ)
    CALL InterruptX(&H21, InregsX, OutregsX)
    ' check carry flag error
    IF (OutregsX.flags AND &H1) = &H0 THEN
       ' store filename attribute bits
       Filebits% = ASC(DTAfile.Filebits)
       ' check directory bit
       IF (Filebits% AND &H10) = &H10 THEN
          PRINT "Directory exists."
       ELSE
          PRINT "Filename exists."
       END IF
    ELSE
       PRINT "Filespec not found."
    END IF
    ' restore current dta
    InregsX.AX = &H1A00
    InregsX.DS = Current.DTA.SEG
    InregsX.DX = Current.DTA.OFF
    CALL InterruptX(&H21, InregsX, OutregsX)
    END
    

    【讨论】:

    • 如果你找不到 qb.qlb 然后运行这个:link /q qb.lib,qb.qlb,Nul,bqlb45.lib;
    【解决方案4】:

    另一个计算 QB45 中目录/文件名的子程序:

    DECLARE SUB CheckSpec (Var$, Var1!, Var2!)
    REM subroutine to count directories\filenames in QB pd 2019 ejo
    REM load QB /L QB.QLB
    REM links qb.lib into qb.qlb
    REM   link /q qb.lib,qb.qlb,Nul,bqlb45.lib;
    TYPE DTAtype
      Drive AS STRING * 1
      SearchTemplate AS STRING * 11
      SearchAttr AS STRING * 1
      EntryCount AS STRING * 2
      ClusterNumber AS STRING * 2
      Reserved AS STRING * 4
      Filebits AS STRING * 1
      FileTime AS STRING * 2
      FileDate AS STRING * 2
      FileSize AS STRING * 4
      ASCIIZfilename AS STRING * 13
    END TYPE
    TYPE RegTypeX
     AX    AS INTEGER
     BX    AS INTEGER
     CX    AS INTEGER
     DX    AS INTEGER
     bp    AS INTEGER
     si    AS INTEGER
     di    AS INTEGER
     flags AS INTEGER
     DS    AS INTEGER
     ES    AS INTEGER
    END TYPE
    DECLARE SUB InterruptX (intnum AS INTEGER, inreg AS RegTypeX, outreg AS RegTypeX)
    DO
      COLOR 15, 0
      PRINT "Enter filespec(*.*)";
      INPUT Filespec$
      IF Filespec$ = "" THEN Filespec$ = "*.*"
      COLOR 14, 0
      PRINT "Searching: "; Filespec$
      CALL CheckSpec(Filespec$, Var1, Var2)
      COLOR 15, 0
      IF Var1 THEN PRINT "Directories:"; Var1
      IF Var2 THEN PRINT "Filenames:"; Var2
      IF Var1 = 0 AND Var2 = 0 THEN PRINT "No files foound."
      COLOR 14, 0
      PRINT "Again(y/n)?";
      LOCATE , , 1
      DO
         x$ = INKEY$
         IF LCASE$(x$) = "n" THEN PRINT : COLOR 7, 0: END
         IF LCASE$(x$) = "y" THEN PRINT : COLOR 7, 0: EXIT DO
      LOOP
    LOOP
    END
    ' var1=dirs, var2=files
    SUB CheckSpec (Var$, Var1, Var2)
     DIM InregsX AS RegTypeX
     DIM OutregsX AS RegTypeX
     DIM DTAfile AS DTAtype
     DIM ASCIIZ AS STRING * 260
     DIM Current.DTA.SEG AS INTEGER
     DIM Current.DTA.OFF AS INTEGER
     ASCIIZ = UCASE$(Var$) + CHR$(0)
     Var1 = 0: Var2 = 0
     ' store current dta
     InregsX.AX = &H2F00
     CALL InterruptX(&H21, InregsX, OutregsX)
     Current.DTA.SEG = OutregsX.ES
     Current.DTA.OFF = OutregsX.BX
     ' store function dta
     InregsX.AX = &H1A00
     InregsX.DS = VARSEG(DTAfile)
     InregsX.DX = VARPTR(DTAfile)
     CALL InterruptX(&H21, InregsX, OutregsX)
     ' findfirst
     InregsX.AX = &H4E00
     InregsX.CX = &H37
     InregsX.DS = VARSEG(ASCIIZ)
     InregsX.DX = VARPTR(ASCIIZ)
     CALL InterruptX(&H21, InregsX, OutregsX)
     ' check carry flag error
     DO
        IF (OutregsX.flags AND &H1) = &H0 THEN
           ' store filename attribute bits
           Filebits% = ASC(DTAfile.Filebits)
           ' check directory bit
           IF (Filebits% AND &H10) = &H10 THEN
              Var1 = Var1 + 1
           ELSE
              Var2 = Var2 + 1
           END IF
           ' find next filename
           InregsX.AX = &H4F00
           CALL InterruptX(&H21, InregsX, OutregsX)
        ELSE
           EXIT DO
        END IF
     LOOP
     ' restore current dta
     InregsX.AX = &H1A00
     InregsX.DS = Current.DTA.SEG
     InregsX.DX = Current.DTA.OFF
     CALL InterruptX(&H21, InregsX, OutregsX)
    END SUB
    

    【讨论】:

      【解决方案5】:

      另一个检测目录的样本存在于QB64中:

      PRINT "Enter dirspec";: INPUT Spec$
      IF _DIREXISTS(Spec$) THEN
          PRINT "Directory exists."
      ELSE
          PRINT "Directory not found."
      END IF
      END
      

      【讨论】:

        猜你喜欢
        • 2014-01-12
        • 2014-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-01
        • 1970-01-01
        • 2018-02-19
        • 2011-11-22
        相关资源
        最近更新 更多