【问题标题】:How To Get Default Directories Of Drives In QB64如何在 QB64 中获取驱动器的默认目录
【发布时间】:2016-09-06 01:04:08
【问题描述】:

我一直在使用以下代码来获取所有驱动器的默认目录,但是我不想使用 _CWD$

有没有更有效的方法来做到这一点?

REM get default directory of drives.
ON ERROR GOTO ErrSub
FOR D = 1 TO 26
    D$ = CHR$(D + 64) + ":"
    DataError = 0
    CHDIR D$
    IF DataError = 0 THEN
        PRINT _CWD$
    END IF
NEXT
END

ErrSub:
DataError = ERR
RESUME NEXT

【问题讨论】:

  • 为什么不想使用_CWD$,效率不够怎么办?
  • 我的 quadcore 不会运行最近的 QB64 脏构建,只有一种不支持 _CWD$ 的旧 QB64 方言,当只有一个错误例程和 1,000 行代码时,错误反弹效率不高.

标签: basic qbasic qb64


【解决方案1】:

对于 _CWD$ 替换,您可以这样做:

' Need to use DECLARE LIBRARY for the C function getcwd(string, stringSize).
DECLARE LIBRARY ""
    FUNCTION getcwd$ (buffer$, BYVAL buflen)
END DECLARE

' Wrapper function for making usage of getcwd$ more BASIC-like.
DECLARE FUNCTION qb64cwd$ ()

' Print the current working directory.
PRINT qb64cwd$

FUNCTION qb64cwd$ ()
    ' 32768 characters should be more than large enough on any OS.
    REDIM s AS STRING * 32768
    qb64cwd$ = getcwd$(s, 32768)
END FUNCTION

虽然您实际上并不需要包装函数,但 C 函数要求您传递具有足够可写内存量的字符串。也就是说,getcwd 不分配内存。它希望您传递足够数量的内存,而 QB64 的动态大小的STRING 类型不会这样做,因此使用包装器创建足够大小的固定长度字符串并将其传递给函数。 wrapper 在大多数情况下做得足够好。请注意,这也应该适用于 OS X 和 Linux(以及几乎任何其他运行 QB64 的类似 POSIX 的系统,甚至可能包括 Android)。我没有在这些系统上测试过,但它应该可以工作,因为getcwd 是一个 POSIX 函数。

当这个数字不够大时会发生什么?好吧,QB64 不允许将数组传递给库函数,并且您不能使用STRING * variable,除非variableCONST variable = ...。这意味着您无法扩大字符串并重试。如果碰巧告诉你出了什么问题,你可能应该提出一个错误(例如ERROR 75)。

【讨论】:

  • 这正是我想要的!我使用 ASCIIZ 作为字符串 * 260 来代替缓冲区。
【解决方案2】:

一种在 QB64 中获取所有驱动器的默认目录而不会出现错误捕获的方法:

REM get default directory of drives.
FOR D = 65 TO 90
    D$ = CHR$(D) + ":"
    IF _DIREXISTS(D$) THEN
        CHDIR D$
        PRINT _CWD$
    END IF
NEXT
END

【讨论】:

  • 仍然无法复制 _CWD$ 函数。
  • 仍然可能提示插入设备媒体(不是 cd-rom)。
【解决方案3】:

还注意到默认目录并不总是文件的启动目录,因此,这里有一个描述每个目录的示例:

' directory file was loaded from
PRINT _CWD$

' declare external libraries.
DECLARE DYNAMIC LIBRARY "kernel32"
    FUNCTION SetCurrentDirectoryA% (f$)
END DECLARE

' force default path
x$ = _STARTDIR$
f$ = x$ + CHR$(0)
x = SetCurrentDirectoryA(f$)

' directory where user is in dos
PRINT _CWD$

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多