Перечисление всех доступных букв дисков в Windows - PullRequest
15 голосов
/ 13 ноября 2008

Я хочу перечислить все доступные буквы дисков (которые еще не заняты) в Windows, используя VC ++.

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

Ответы [ 5 ]

14 голосов
/ 13 ноября 2008

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

6 голосов
/ 13 ноября 2008

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

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

3 голосов
/ 01 декабря 2012

Я не уверен, как их перечислить или будет ли он компилироваться на Visual C ++, но я прописал это в Dev C ++ или Code Blocks, чтобы проверить, какой диск доступен с помощью CreateFile и какой тип диска с помощью GetDriveType. Программа проверяет диски от А до Я:

#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++;
        }
    }
}
3 голосов
/ 13 ноября 2008

Функция GetLogicalDriveStrings является хорошей отправной точкой.

1 голос
/ 16 июля 2012

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

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

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

...