高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先


NW 09 - ボリュームがネットワークボリュームかどうかを調べる方法

(98 年 6 月 1 日更新)


Q: ボリュームがネットワークからマウントされているかどうかを調べる確かな方法を教えてください。

A: あるボリュームがネットワークからマウントされているかどうかを調べる最良の方法は、GetVolParmsInfoBuffer の vMServerAdr フィールドをゼロと比較することです (GetVolParmsInfoBuffer は PBHGetVolParms によって返されます)。このフィールドはローカルボリュームの場合はゼロ、ネットワークボリュームの場合はゼロ以外になります。このテクニックは、DTS サンプルコードの MoreFiles にある isNetworkVolume ルーチンで紹介しています。

vMServerAdr フィールドは実際には、そのボリュームをエクスポートするサーバの AppleTalk アドレス (AddrBlock) として定義されています。ボリュームが AppleTalk からマウントされている場合はそのとおりですが、AppleShare IP など他種のネットワークファイルシステムの場合は意味を持ちません。しかし、vMServerAdr の値がゼロ以外であれば、AppleTalk ではないにしても、何らかのネットワークファイルシステムであることを示しています。

ボリュームが AppleShare ボリュームかどうかを調べたいだけの場合は、ボリュームの制御ドライバのリファレンス番号を ".AFPTranslator" ドライバのドライバリファレンス番号と比較して調べることができます。

次のコードはボリュームのリストを順に調べて、AFP 制御のボリュームをすべて表示するものです。

static void PrintAFPVolumes()
{
    OSErr err;
    HVolumeParam volPB;
    Str255 volName;
    DriverRefNum afpRefNum;
    SInt16 index;
 
    err = OpenDriver("\p.AFPTranslator", &afpRefNum);
    if (err == noErr) {
        index = 1;
        do {
            volName[0] = 0;
            volPB.ioNamePtr = volName;
            volPB.ioVRefNum = 0;
            volPB.ioVolIndex = index;
            err = PBHGetVInfoSync((HParmBlkPtr) &volPB);
            if (err == noErr) {
                if (volPB.ioVDrvInfo != 0 &&
                    volPB.ioVDRefNum == afpRefNum) {
                    printf("%#s\n", volName);
                }
            }
            index += 1;
        } while (err == noErr);
    }
}

Quinn "The Eskimo!" (執筆)
Quinn "The Eskimo!" (改訂)
Worldwide Developer Technical Support


[ Technical Q&A's : Network : NW09 ]