Я использовал следующий код, чтобы получить каталоги по умолчанию для всех дисков, однако я не хочу использовать _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
2
eoredson 6 Сен 2016 в 04:04

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$
0
eoredson 30 Дек 2016 в 02:28

Один из способов получить каталоги по умолчанию для всех дисков в 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
1
eoredson 10 Сен 2016 в 01:03

Для замены _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 (и практически в любой другой системе, подобной POSIX, на которой работает QB64, возможно, даже включая Android). Я не тестировал эти системы, но он должен работать, поскольку getcwd является функцией POSIX.

Что произойдет, если этого числа недостаточно? Что ж, QB64 не позволяет передавать массивы библиотечным функциям, и вы не можете использовать STRING * variable, если variable не равен CONST variable = .... Это означает, что вы не можете увеличить строку и повторить попытку. Вероятно, вам следует поднять ошибку, если это произойдет, чтобы сообщить вам, что что-то пошло не так (например, ERROR 75).

2
user539810user539810 11 Сен 2016 в 17:10