Подтвердить что ты не робот

Перечисление всех доступных букв диска в Windows

Я хочу перечислить все доступные буквы диска (которые еще не выполнены) в Windows с помощью VС++.

Как я могу это сделать?

4b9b3361

Ответ 1

:: GetLogicalDrives() возвращает список доступных (читай: используемых) дисков в виде битов в маске. Это должно включать подключенные сетевые диски. Таким образом, вы можете просто пройтись по битам, чтобы найти биты, которые равны нулю, что означает отсутствие привода. Если вы сомневаетесь, вы всегда можете вызвать :: GetDriveType() с буквой диска + ":\" (":\\" в C-коде или _T(":\\") в терминологии, поддерживающей Unicode, конечно), и это должно вернуть DRIVE_UNKNOWN или DRIVE_NO_ROOT_DIR, если диск доступен.

Ответ 2

GetLogicalDriveStrings может предоставить вам только список используемых в настоящее время букв дисков.

GetVolumeInformation можно использовать для получения дополнительной информации о конкретном диске.

Ответ 4

Не пытайтесь перечислить их, или если они будут компилироваться на Visual С++, но я закодировал это на Dev С++ или Code Blocks, чтобы проверить, какой диск доступен, используя 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++;
        }
    }
}

Ответ 5

GetLogicalDrives и GetLogicalDriveStrings не видят сетевых дисков, созданных в другом пространстве имен.

Например, вызов функций из службы, запущенной в локальной системе, не будет отображаться сетевыми дисками, созданными зарегистрированным пользователем.

Это происходит, начиная с Windows XP. В следующей статье описывается этот случай: http://msdn.microsoft.com/en-us/library/windows/desktop/aa363908(v=vs.85).aspx

Ответ 6

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;
}

перечисляя их