Как получить каталоги дисков по умолчанию в 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
3 ответа
Для замены _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
type не будет этого делать, поэтому используется оболочка для создания строки фиксированной длины достаточного размера и передачи ее в функцию. Обертка делает это достаточно хорошо, чтобы в большинстве случаев хватило. Обратите внимание, что это также должно работать на OS X и Linux (и почти на любой другой POSIX-подобной системе, на которой работает QB64, возможно, даже включая Android). Я не тестировал на этих системах, но он должен работать с getcwd
это функция POSIX
Что происходит, когда это число недостаточно велико? Ну, QB64 не позволяет передавать массивы в библиотечные функции, и вы не можете использовать STRING * variable
если variable
является CONST variable = ...
, Это означает, что вы не можете увеличить строку и попробовать еще раз. Вам, вероятно, следует выдать ошибку, если это случится, чтобы сказать вам, что что-то пошло не так (например, ERROR 75
).
Один из способов получить каталоги по умолчанию для всех дисков в 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
Также заметили, что каталог по умолчанию не всегда является каталогом, из которого был запущен файл, поэтому вот пример, описывающий каждый:
' 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$