2016-09-06 10 views
1

Я использую следующий код, чтобы получить каталоги по умолчанию для всех дисков, однако я не хочу использовать _CWD $Как получить по умолчанию каталоги дисков в Qb64

есть более эффективный способ сделать это?

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 
+1

Почему вы не хотите использовать '' $ _CWD и что об этом недостаточно эффективно? – BdR

+0

В моем четырехъядерном процессоре не будут запущены последние грязные сборки QB64, только старый диалект QB64, который не поддерживает _CWD $, и это не эффективно для отказов ошибок, когда есть только одна процедура ошибки и 1000 строк кода. – eoredson

ответ

2

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

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

+0

Это именно то, что я искал! Вместо этого я использую ASCIIZ как строку * 260 для буфера. – eoredson

1

Один из способов получить стандартные каталоги всех дисков в 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 
+0

Все еще не может повторить функцию _CWD $. – eoredson

+0

Все еще может запросить вставить носитель для устройств (не cd-rom). – eoredson

0

также заметил, каталог по умолчанию не всегда каталог, в котором файл был запущен из, так, здесь приведен пример описания каждого:

' 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$