2016-09-06 16 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

と十分に効率的でないのはどうでしょうか? – BdR

+0

クワッドコアは最新のQB64ダーティビルドを実行せず、_CWD $をサポートしていない古い方言のQB64しか使用できません。エラールーチンが1つで、コード行が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

は、デフォルトのディレクトリにも気づいたことがあり、常にファイルがから開始されたディレクトリではありませんので、ここではそれぞれを説明サンプルです:あなたは `_CWD $`を使用したくないのはなぜ

' 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$ 
関連する問題