枚举Windows中所有可用的驱动器号

时间:2008-11-13 08:38:47

标签: c++ winapi drives

我想使用VC ++枚举Windows中所有可用的驱动器号(尚未使用)。

我该怎么做?

7 个答案:

答案 0 :(得分:14)

::GetLogicalDrives()返回一个可用(读取:已使用)驱动器列表作为掩码中的位。这应包括映射的网络驱动器。因此,您可以简单地遍历位以查找零的位,这意味着不存在驱动器。如果有疑问,您可以随时使用驱动器号+ ":\"(C代码中为":\\"或当前使用Unicode感知术语中的_T(":\\"))调用::GetDriveType(),并且如果驱动器可用,则应返回DRIVE_UNKNOWNDRIVE_NO_ROOT_DIR

答案 1 :(得分:6)

GetLogicalDriveStrings可以为您提供当前使用的驱动器号列表。

GetVolumeInformation可用于获取有关特定驱动器的更多信息。

答案 2 :(得分:3)

GetLogicalDriveStrings Function是一个很好的起点。

答案 3 :(得分:3)

我不知道如何枚举它们或者它是否会在visual c ++上编译,但我在Dev C ++或Code Blocks上对此进行了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++;
        }
    }
}

答案 4 :(得分:1)

GetLogicalDrives和GetLogicalDriveStrings没有看到在不同的命名空间中创建的网络驱动器。

例如,从在本地系统下运行的服务调用函数将不会看到已记录用户创建的网络驱动器。

这是从Windows XP开始的。以下文章描述了这种情况: http://msdn.microsoft.com/en-us/library/windows/desktop/aa363908(v=vs.85).aspx

答案 5 :(得分:0)

std::vector<std::string> getListOfDrives() {
    std::vector<std::string> arrayOfDrives;
    char* szDrives = new char[MAX_PATH]();
    if (GetLogicalDriveStringsA(MAX_PATH, szDrives));
    for (int i = 0; i < 100; i += 4)
        if (szDrives[i] != (char)0) 
            arrayOfDrives.push_back(std::string{szDrives[i],szDrives[i+1],szDrives[i+2]});
    delete[] szDrives;
    return arrayOfDrives;
}

返回驱动器的向量,例如C:\ D:\ E:\ F:\

std::vector<std::string> drives = getListOfDrives();

for (std::string currentDrive : drives) {
    std::cout << currentDrive << std::endl;
}

枚举它们

答案 6 :(得分:0)

以下代码将完成这项工作:

for (w_chDrv = 'C'; w_chDrv <= 'Z'; w_chDrv++)
{
    // make root path
    _stprintf_s(w_szRootPath, 3, _T("%c:"), w_chDrv);

    // get driver type
    w_nDriverType = GetDriveType(w_szRootPath);
    if ((w_nDriverType != DRIVE_REMOVABLE) && (w_nDriverType != DRIVE_FIXED))
            continue;
    // if you got here that means w_szRootPath is a valid drive
}