2016-09-06 6 views
1

에서 드라이브의 기본 디렉토리를 얻는 방법 _CWD $내가 그러나 내가 사용하지 않는, 모든 드라이브의 기본 디렉토리를 얻기 위해 다음 코드를 사용하고있다 QB64

할 수있는보다 효율적인 방법이 이? 오류 트래핑없이 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 더티 빌드를 실행하지 않고 오직 _CWD $를 지원하지 않는 QB64의 구어체 만 사용하며 하나의 오류 루틴과 1,000 초 코드 행이있을 때 오류가 발생하는 것은 효율적이지 않습니다. – eoredson

답변

2

, 당신은이 작업을 수행 할 수 있습니다

' 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 (그리고 QB64가 실행되는 다른 POSIX와 비슷한 시스템, 아마도 Android를 포함하여)에서도 작동해야합니다. 나는 그 시스템에서 테스트하지 않았지만, getcwd은 POSIX 함수이기 때문에 작동 할 것이다.

숫자가 너무 크면 어떻게됩니까? QB64에서는 배열을 라이브러리 함수에 전달할 수 없으며, 이 CONST variable = ...이 아니면 STRING * variable을 사용할 수 없습니다. 즉, 문자열을 확대하고 다시 시도 할 수 없음을 의미합니다. 실수로 문제가 발생했다면 오류가 발생해야합니다 (예 : ERROR 75).

+0

그게 내가 찾고 있던 바로 그거야! 대신 ASCIIZ 문자열 * 260 버퍼로 사용하고 있습니다. – eoredson

1

한 가지 방법은 다음 _CWD의 $ 교체

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$ 
관련 문제