如何在 QB64 中获取驱动器的默认目录
How To Get Default Directories Of Drives In QB64
我一直在使用下面的代码来获取所有驱动器的默认目录,但是我不想使用 _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
一种在 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$ 替换,您可以这样做:
' 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
除非 variable
是 CONST variable = ...
。这意味着您不能放大字符串并重试。如果这恰好告诉您出了什么问题,您可能应该提出错误(例如 ERROR 75
)。
还注意到默认目录并不总是文件的起始目录,因此,这里有一个描述每个目录的示例:
' 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$
我一直在使用下面的代码来获取所有驱动器的默认目录,但是我不想使用 _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
一种在 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$ 替换,您可以这样做:
' 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
除非 variable
是 CONST variable = ...
。这意味着您不能放大字符串并重试。如果这恰好告诉您出了什么问题,您可能应该提出错误(例如 ERROR 75
)。
还注意到默认目录并不总是文件的起始目录,因此,这里有一个描述每个目录的示例:
' 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$