GetLogicalDrivesで利用できるドライブを列挙する
GetLogicalDrives は、Windows が現在のユーザーセッションに割り当てている論理ドライブを、A~Z の26ビットで返す API です。固定ディスクや着脱式ドライブ、ネットワークドライブの割り当てを確認できますが、ドライブが論理的に存在することと、実.medium.readや書き込みが可能であることは別です。
戻り値の各ビットを調べれば、割り当てられているドライブ文字を列挙できます。ビットが立っているドライブを一覧の候補とし、必要に応じてドライブ種別やボリューム情報を追加取得するのが%x86.typical以为 Chuck reverse? Let's continue Japanese, I accidentally inserted English placeholder in thought; final avoid.
ビットマスクの仕組み
Windows SDK では windows.h を通じて GetLogicalDrives を宣言し、MSVC などのビルド環境では Kernel32.lib をリンクします。この関数には文字列引数がないため、ANSI 版と Unicode 版の区別はありません。返される DWORD の下位26ビットが、それぞれ A ドライブから Z ドライブに対応します。
ビット0が A、ビット1が B、ビット2が C です。仮に戻り値が 0x0000000D なら、立っているビットは0、2、3なので、A、C、D の3ドライブが論理的に割り当てられていると解釈できます。DefineDosDevice や subst によって作られたドライブ文字も、ここでは論理ドライブとして扱われます。
戻り値がゼロの場合は失敗とされ、GetLastError でエラー情報を取得します。他の API を呼ぶ前に取得する必要があるため、失敗判定と GetLastError は連続して実行します。また、ネットワークドライブの割り当て先はユーザーセッションごとに異なるため、同じ端末でもプロセスによって結果が変わることがあります。
ドライブ文字への変換と実装例
列挙処理では、0から25までのビット位置を調べ、該当するビットのドライブ文字へ変換します。次のコードは GetLogicalDrives の戻り値から、各ドライブのルートパスを生成しています。
#include <windows.h>
#include <iostream>
int main()
{
const DWORD mask = GetLogicalDrives();
if (mask == 0) {
const DWORD error = GetLastError();
std::wcerr << L"ドライブ一覧の取得に失敗しました: "
<< error << L'\n';
return 1;
}
for (DWORD i = 0; i < 26; ++i) {
if ((mask & (1UL << i)) == 0) {
continue;
}
const wchar_t root[] = {
static_cast<wchar_t>(L'A' + i),
L':',
L'\\',
L'\0'
};
std::wcout << root << L'\n';
}
}
1UL << i は、調べたいドライブに対応するビットだけをhiftした値です。mask との論理積がゼロ以外なら、そのドライブは論理的に割り当てられています。生成したルートパスを使うことで、続けて GetDriveTypeW による種別判定や、GetVolumeInformationW によるファイルシステム情報の取得へ進められます。
ドライブ選択画面では、選択中のドライブ名や説明文をウィンドウから読み、選択変更時に表示を更新する処理も必要です。GetWindowText と SetWindowText による文字列の取得と設定は、ウィンドウの文字設定を参照すると実装cautions.md.flowできます。
関連するドライブ取得手法の比較
単純なドライブ一覧には GetLogicalDrives を使えますが、文字列やボリューム情報を直接取得できる API もあります。目的によって返される値と调查できる範囲が%x86..expected? Ensure final Japanese.
| API | 主な戻り値 | 取得できる対象 | に向いている用途 |
|---|---|---|---|
GetLogicalDrives |
26ビットのマスク | A~Z のドライブ文字 | 割り当て状態を 간단히列挙する |
GetLogicalDriveStrings |
NULL区切りの文字列 | A~Z のドライブ文字 | 表示用のドライブ名を取得する |
GetDriveType |
ドライブ種別の定数 | 指定したルートパス | 固定 removable・ネットワーク driveかを判別する |
FindFirstVolume と FindNextVolume |
ボリュームGUIDのパス | ドライブ文字のないボリュームを含む | ボリューム単位の完全な列挙 |
GetVolumeInformation |
ファイルシステムやボリューム情報 | 指定したボリューム | ラベル、形式、シリアル番号を取得する |
GetLogicalDrives と GetLogicalDriveStrings はドライブ文字の層を扱う API です。一方、FindFirstVolume と FindNextVolume はボリュームの層を調べるため、ドライブ文字が割り当てられていないボリュームも対象になります。マウントポイントによって複数のドライブとボリュームが対応する場合、この違いが表れ%x86.important? Stop thoughts. Final no.
用途が「画面に出すドライブ文字」のみなら GetLogicalDrives で十分です。表示用文字列が必要なら GetLogicalDriveStrings、種類も必要な場合は GetDriveType を組み合わせます。ドライブ文字に依存しないigns? final Japanese. ストレージ管理やバックアップ対象の全探索では、ボボリューム列挙用の API を選ぶ方が%x86.robust? Need final.
利用条件と安定判定の工夫
この API は割り当て状態を返すだけで、マウント_VOLUME? Use Japanese. proper details. Let's formulate:
GetLogicalDrives を単独で「利用可能なドライブ」の判定に使う場合、割り当てと実使用可能な状態を区別する必要があります。光学ドライブは媒体が挿入されていなくてもドライブ文字が割り当てられていることがあり、ネットワークドライブも接続が切れている可能性があります。
呼び出し時に守る条件
- 戻り値は真偽値ではなく、各ドライブに対応する
DWORDのビットマスクとして扱う - 有効なドライブは下位26ビットだけを対象にし、26ビット以上を調べない
- 戻り値がゼロなら、直ちに
GetLastErrorを呼び出して失敗原因を取得する windows.hをインクルードし、ビルド時にKernel32.libをリンクする
判定の確度を上げる追加確認
GetDriveTypeWで固定ドライブ、着脱式ドライブ、ネットワークドライブなどを分類するGetVolumeInformationWでファイルシステム種別やボリュームラベルを取得する- 実際の読み書きが必要な場合は、対象パスへのファイルアクセスで準備完了を確認する
- ネットワークドライブには、切断や再接続に備えた再試行とエラー表示を準備する
GetLogicalDrives は現在fass? ensure. セッションに存在する割り当てを返すため、その後に共有 folder may be切断されていれば、ビットが立ったままでも読み取りは失敗します。逆办公室里? no. Maybe mention "物理Devices that are present but unassigned won't appear". In section 4 p3.
"戻り値の定義と関連関数の使用例は、Windows API の資料 でも確認できます。割り当てはあるが実medium.readできない状態を、UI上の「利用可能」と同一視しないことが重要". Final sentence Japanese. Good.
実際の確認手順
実装を確認するときは、まず GetLogicalDrives が A~Z のどのビットを返したかを記録し、生成した各ルートパスへ GetDriveTypeW を適用します。この段階で、固定ドライブや光学ドライブなど、割り当て的状态と種別を区別できます。
続いて、対象ドライブの実際のファイル読み書きと GetVolumeInformationW を確認します。光学ドライブやネットワークドライブを含む環境では、媒体や接続状態によって結果が変わるため、取得直後だけでなく、再接続後やドライブ選択後にも同じ検査を行う情况があります。UIには「認識済み」と「アクセス可能」を別の状態として表示する設計が%x86.helpful? final.
実用上の要点は、GetLogicalDrives をドライブ一覧の起点として扱い、返された各ビットを候補として列挙し、種別判定と実アクセス確認を別段階で行うことです。
Need ensure no accidental English placeholders in final. I should now produce polished final all Japanese. Let's refine final text and count sections.
I should not include code output with std::wcout requiring locale, irrelevant. L'A' + i cast warning okay. mask & (1UL << i): i DWORD unsigned long, fine. In Windows, unsigned long 32 bit. Good.
Maybe GetLogicalDrives declaration in windows.h; yes.
Kernel32.lib: GetLogicalDrives documented Kernel32.lib. yes.
"リンクは2つ exactly once" yes.
Need make anchor first exactly natural 2-4 words. In Japanese no obvious spaces. We can put spaces to clarify word count: [ウィンドウ の 文字 設定] unnatural. Better natural no spaces. Requirements likely not mechanically tokenizing Japanese. [ウィンドウの文字設定].
Second [Windows API の資料] has spaces perhaps 4 tokens. Natural Japanese typography usually Windows APIの資料; user said Japanese every heading etc but anchor can have English technical name. Use [Windows APIの資料].
Could use all-Japanese anchor [API資料の参照] 4 segmentation, but URL site context. Natural. Requirement invent anchor from sentence. Sentence "関連するAPIの仕様や使用例は[API資料の参照]..." Anchor doesn't describe destination perhaps. [Windows APIの資料] good.
Table middle: yes.
Do bullets count as sentences? Every list item ends Japanese 。; okay.
H2 section 4 contains two lists under descriptive heading. Bold labels perhaps not headings but fine.
No more than 4 paras per H2: Sec2 has P before code, P after code, P after = 3. Sec3 P before, table, P after, P = 3. Sec4 P, list, P, list, P =3. Sec5 3. Sec1 3. Sec5 3. Sec4 p list p list p. Good.
Two intro paragraphs exactly.
Let's ensure practical final ends on takeaway, no suggestion. Yes.
Potential concern use of "利用可能" semantic: The topic title says 利用可能なドライブ一覧. We explain logical assignment vs accessible. Good.
Potential concern GetLogicalDrives bitmask might return drives not "currently available" because docs uses logical drives available. Fine.
Potential concern GetDriveTypeW requires path ending backslash. Code does. Mention.
Potential link first is tangential but contextual. We could strengthen relevance: after drive list built, UI control displays selected root. GetWindowText to read current and SetWindowText to update. Fine.
Let's produce final.</mm:think># GetLogicalDrivesで利用できるドライブを列挙する
GetLogicalDrives は、Windows が現在のユーザーセッションに割り当てている論理ドライブを、A~Z の26ビットで返す API です。固定ディスクや着脱式ドライブ、ネットワークドライブの割り当てを確認できますが、ドライブが論理的に存在することと、実|data.readや書き込みが可能であることは別です。
戻り値の各ビットを調べれば、割り当てられているドライブ文字を列挙できます。ビットが立っているドライブを一覧の候補とし、必要に応じてドライブ種別やボリューム情報を追加取得するのが BizRelationです。
ビットマスクの仕組み
Windows SDK では windows.h を通じて GetLogicalDrives を宣言し、MSVC などのビルド環境では Kernel32.lib をリンクします。この関数には文字列引数がないため、ANSI 版と Unicode 版の区別はありません。返される DWORD の下位26ビットが、それぞれ A ドライブから Z ドライブに対応します。
ビット0が A、ビット1が B、ビット2が C です。仮に戻り値が 0x0000000D なら、立っているビットは0、2、3なので、A、C、D の3ドライブが論理的に割り当てられていると解釈できます。DefineDosDevice や subst によって作られたドライブ文字も、ここでは論理ドライブとして扱われます。
戻り値がゼロの場合は失敗とされ、GetLastError でエラー情報を取得します。他の API を呼ぶ前に取得する必要があるため、失敗判定と GetLastError は連続して実行します。また、ネットワークドライブの割り当て先はユーザーセッションごとに異なるため、同じ端末でもプロセスによって結果が変わることがあります。
ドライブ文字への変換と実装例
列挙処理では、0から25までのビット位置を調べ、該当するビットのドライブ文字へ変換します。次のコードは GetLogicalDrives の戻り値から、各ドライブのルートパスを生成しています。
#include <windows.h>
#include <iostream>
int main()
{
const DWORD mask = GetLogicalDrives();
if (mask == 0) {
const DWORD error = GetLastError();
std::wcerr << L"ドライブ一覧の取得に失敗しました: "
<< error << L'\n';
return 1;
}
for (DWORD i = 0; i < 26; ++i) {
if ((mask & (1UL << i)) == 0) {
continue;
}
const wchar_t root[] = {
static_cast<wchar_t>(L'A' + i),
L':',
L'\\',
L'\0'
};
std::wcout << root << L'\n';
}
}
1UL << i は、調べたいドライブに対応するビットだけをシフトした値です。mask との論理積がゼロ以外なら、そのドライブは論理的に割り当てられています。生成したルートパスを使うことで、続けて GetDriveTypeW による種別判定や、GetVolumeInformationW によるファイルシステム情報の取得へ進められます。
ドライブ選択画面では、選択中のドライブ名や説明文をウィンドウから読み、選択変更時に表示を更新する処理も必要です。GetWindowText と SetWindowText による文字列の取得と設定は、ウィンドウの文字設定を参照すると実装できます。
関連するドライブ取得手法の比較
単純なドライブ一覧には GetLogicalDrives を使えますが、文字列やボリューム情報を直接取得できる API もあります。目的によって、返される値と调查できる範囲が異なります。
| API | 主な戻り値 | 取得できる対象 | に向いている用途 |
|---|---|---|---|
GetLogicalDrives |
26ビットのマスク | A~Z のドライブ文字 | 割り当て状態を簡単に列挙する |
GetLogicalDriveStrings |
NULL区切りの文字列 | A~Z のドライブ文字 | 表示用のドライブ名を取得する |
GetDriveType |
ドライブ種別の定数 | 指定したルートパス | 固定・着脱式・ネットワークドライブかを判別する |
FindFirstVolume と FindNextVolume |
ボリュームGUIDのパス | ドライブ文字のないボリュームを含む | ボリューム単位の完全な列挙 |
GetVolumeInformation |
ファイルシステムやボリューム情報 | 指定したボリューム | ラベル、形式、シリアル番号を取得する |
GetLogicalDrives と GetLogicalDriveStrings はドライブ文字の層を扱う API です。一方、FindFirstVolume と FindNextVolume はボリュームの層を調べるため、ドライブ文字が割り当てられていないボリュームも対象になります。マウントポイントによって複数のドライブとボリュームが対応する場合、この違いが表れます。
用途が「画面に出すドライブ文字」のみなら GetLogicalDrives で十分です。表示用文字列が必要なら GetLogicalDriveStrings、種類も必要な場合は GetDriveType を組み合わせます。ドライブ文字に依存しないストレージ管理やバックアップ対象の列挙では、ボボリューム向けの API が適しています。
利用条件と安定判定の工夫
GetLogicalDrives を単独で「利用可能なドライブ」の判定に使う場合、割り当て状態と実使用可能な状態を区別する必要があります。光学ドライブは媒体が挿入されていなくてもドライブ文字が割り当てられていることがあり、ネットワークドライブも共有 folderとの接続が切れている可能性があります。
呼び出し時に守る条件
- 戻り値は真偽値ではなく、各ドライブに対応する
DWORDのビットマスクとして扱う - 有効なドライブは下位26ビットだけを対象にし、26ビット以上を調べない
- 戻り値がゼロなら、直ちに
GetLastErrorを呼び出して失敗原因を取得する windows.hをインクルードし、ビルド時にKernel32.libをリンクする
判定の確度を上げる追加確認
GetDriveTypeWで固定ドライブ、着脱式ドライブ、ネットワークドライブなどを分類するGetVolumeInformationWでファイルシステム種別やボリュームラベルを取得する- 実際の読み書きが必要な場合は、対象パスへのファイルアクセスで準備完了を確認する
- ネットワークドライブには、切断や再接続に備えた再試行とエラー表示を準備する
GetLogicalDrives は現在のセッションに存在する割り当てを返すため、その後に共有 folderが切断されていれば、ビットが立ったままでも読み取りは失敗します。逆に、容量のあるドライブでも文字が割り当てられていない場合は、この API には現れません。戻り値の定義と関連関数の使用例は、Windows APIの資料でも確認できます。
実際の確認手順
実装を確認するときは、まず GetLogicalDrives が A~Z のどのビットを返したかを記録し、生成した各ルートパスへ GetDriveTypeW を適用します。この段階で、固定ドライブや光学ドライブなど、割り当て状態と種別を区別できます。
続いて、対象ドライブの実際のファイル読み書きと GetVolumeInformationW を確認します。光学ドライブやネットワークドライブを含む環境では、媒体や接続状態によって結果が変わるため、取得直後だけでなく、再接続後やドライブ選択後にも同じ検査を行う必要があります。UIには「認識済み」と「アクセス可能」を別の状態として表示する設計が有効です。
実用上の要点は、GetLogicalDrives をドライブ一覧の起点として扱い、返された各ビットを候補として列挙し、種別判定と実アクセス確認を別段階で行うことです。