VC++ を使用して、Windows で使用可能なすべてのドライブ文字 (まだ使用されていないもの) を列挙したいと考えています。
これどうやってするの?
::GetLogicalDrives()は、使用可能な (読み取り: 使用済み) ドライブのリストをマスク内のビットとして返します。これには、マップされたネットワーク ドライブを含める必要があります。したがって、単純にビットをたどって、ドライブが存在しないことを意味するゼロのビットを見つけることができます。確信が持てない場合は、ドライブ文字 + (もちろん、C コードでは、またはUnicode 対応の用語では) を指定して::GetDriveType()をいつでも呼び出すことができ、ドライブが使用可能な場合はorを返す必要があります。":\"
":\\"
_T(":\\")
DRIVE_UNKNOWN
DRIVE_NO_ROOT_DIR
GetLogicalDriveStrings
現在使用されているドライブ文字のリストだけを取得できます。
GetVolumeInformation
特定のドライブに関する詳細情報を取得するために使用できます。
GetLogicalDriveStrings関数は、出発点として適しています。
それらを列挙する方法や、ビジュアル C++ でコンパイルされるかどうかはわかりませんが、Dev C++ またはコード ブロックでこれを sturm コード化して、CreateFile を使用してアクセス可能なドライブと、GetDriveType を使用してドライブの種類を確認しました。プログラムはドライブを A から Z までチェックします。
#include <windows.h>
#include <cstring>
#include <sstream>
#include <iostream>
using namespace std;
int __stdcall WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, INT nShowCmd)
{
HANDLE hDevice = NULL;
HANDLE fileFind = NULL;
while(true)
{
Sleep(3005);
char drv='A';
while(drv!='[')
{
Sleep(105);
const char *charDrvCF;
const char *charDrv;
stringstream Str;
string drvStr;
Str<<drv;
Str>>drvStr;
string drvSpc=drvStr+":\\";
string fCheck="\\\\.\\";
string fhCheck=fCheck+drvStr+":";
charDrvCF=fhCheck.c_str();
charDrv=drvSpc.c_str();
hDevice=CreateFile(charDrvCF,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if(hDevice!=INVALID_HANDLE_VALUE)
{
switch(GetDriveType(charDrv))
{
case DRIVE_FIXED:
{
cout<<"Fixed drive detected: "<<charDrv<<endl;
break;
}
case DRIVE_REMOVABLE:
{
cout<<"Removable drive detected: "<<charDrv<<endl;
break;
}
case DRIVE_NO_ROOT_DIR:
{
cout<<"There is no volume mounted at the specified path. "<<charDrv<<endl;
break;
}
case DRIVE_REMOTE:
{
cout<<"The drive is a remote (network) drive. "<<charDrv<<endl;
break;
}
case DRIVE_CDROM:
{
cout<<"The drive is a CD-ROM drive. "<<charDrv<<endl;
break;
}
case DRIVE_RAMDISK:
{
cout<<"The drive is a RAM disk. "<<charDrv<<endl;
break;
}
case DRIVE_UNKNOWN:
{
cout<<"The drive type cannot be determined. "<<charDrv<<endl;
break;
}
}
}
drv++;
}
}
}
GetLogicalDrives と GetLogicalDriveStrings は、別の名前空間で作成されたネットワーク ドライブを認識しません。
たとえば、ローカル システムで実行されているサービスから関数を呼び出しても、ログインしているユーザーによって作成されたネットワーク ドライブは表示されません。
これは、Windows XP 以降で発生しています。次の記事でこのケースについて説明しています: http://msdn.microsoft.com/en-us/library/windows/desktop/aa363908(v=vs.85).aspx