Получить список доступных дисков и их размеры - PullRequest
3 голосов
/ 17 февраля 2010

Я знаю, что вы можете использовать комбинацию GetLogicalDrives () и GetDiskFreeSpaceEx (), чтобы получить список дисков и их размеры. Я использую GetDiskFreeSpaceEx () без проблем, но когда я пытаюсь использовать GetLogicalDrives (), я столкнулся с проблемой: я не хочу проверять каждое возможное письмо, чтобы увидеть, существует ли оно или нет, прежде чем передать его в GetDiskFreeSpaceEx ().

Есть ли более простой способ получить список дисков (дисков) в системе и каковы их размеры? Я использую C на Windows.

Я хочу кое-что прояснить, я ЗНАЮ может быть проще использовать C # и WMI, меня это не интересует, поэтому, пожалуйста, не публикуйте это как возможное решение. Если вы хотите указать, как это делается в C и WMI, сделайте это. НЕТ C ++ или C # спасибо! (как кто-то сделал в моем предыдущем вопросе )

Ответы [ 3 ]

8 голосов
/ 17 февраля 2010

Вы можете использовать GetLogicalDriveStrings - это возвращает буфер, содержащий все действительные буквы дисков в системе.

UPDATE:

Вот пример программы, которую я написал, которая перечисляет диски, используя GetLogicalDriveStrings и выводит некоторую основную информацию о них.

#include <windows.h>
#include <malloc.h>
#include <stdio.h>

int __cdecl main()
{
    DWORD cchBuffer;
    WCHAR* driveStrings;
    UINT driveType;
    PWSTR driveTypeString;
    ULARGE_INTEGER freeSpace;

    // Find out how big a buffer we need
    cchBuffer = GetLogicalDriveStrings(0, NULL);

    driveStrings = (WCHAR*)malloc((cchBuffer + 1) * sizeof(TCHAR));
    if (driveStrings == NULL)
    {
        return -1;
    }

    // Fetch all drive strings    
    GetLogicalDriveStrings(cchBuffer, driveStrings);

    // Loop until we find the final '\0'
    // driveStrings is a double null terminated list of null terminated strings)
    while (*driveStrings)
    {
        // Dump drive information
        driveType = GetDriveType(driveStrings);
        GetDiskFreeSpaceEx(driveStrings, &freeSpace, NULL, NULL);

        switch (driveType)
        {
        case DRIVE_FIXED:
            driveTypeString = L"Hard disk";
            break;

        case DRIVE_CDROM:
            driveTypeString = L"CD/DVD";
            break;

        case DRIVE_REMOVABLE:
            driveTypeString = L"Removable";
            break;

        case DRIVE_REMOTE:
            driveTypeString = L"Network";
            break;

        default:
            driveTypeString = L"Unknown";
            break;
        }

        printf("%S - %S - %I64u GB free\n", driveStrings, driveTypeString,
                  freeSpace.QuadPart / 1024 / 1024 / 1024);

        // Move to next drive string
        // +1 is to move past the null at the end of the string.
        driveStrings += lstrlen(driveStrings) + 1;
    }

    free(driveStrings);

    return 0;

}

На моей машине это выводит:

C:\ - Hard disk - 181 GB free
D:\ - CD/DVD - 0 GB free
E:\ - Hard disk - 806 GB free
5 голосов
/ 17 февраля 2010

GetLogicalDrives () - это предоставляемый системой API для этого. Простой цикл for () преобразует свой результат в буквы диска, например:

DWORD d = GetLogicalDrives();
int i;
TCHAR Drive[] = _T("A:\\");
for(i=0;i<26;i++)
{
    if(d & (1<<i))
    {
        Drive[0] = _T('A')+i;
        GetDiskFreeSpaceEx(Drive, .....);
    }
}

А если вас не устраивает уровень обслуживания, предоставляемый Stack Overflow, не стесняйтесь просить вернуть деньги.

2 голосов
/ 05 апреля 2016

Это код Майкла, который был отклонен в качестве редактирования. Он вызывает ошибки на free (), если только не вставлена ​​фиктивная переменная 'singleDriveString':

#include <windows.h>
#include <malloc.h>
#include <stdio.h>

int __cdecl main()
{
DWORD cchBuffer;
WCHAR* driveStrings;
UINT driveType;
PWSTR driveTypeString;
ULARGE_INTEGER freeSpace;

// Find out how big a buffer we need
cchBuffer = GetLogicalDriveStrings(0, NULL);

driveStrings = (WCHAR*)malloc((cchBuffer + 1) * sizeof(TCHAR));
if (driveStrings == NULL)
{
    return -1;
}

// Fetch all drive strings    
GetLogicalDriveStrings(cchBuffer, driveStrings);

// Loop until we find the final '\0'
// driveStrings is a double null terminated list of null terminated strings)
wchar_t * singleDriveString = driveStrings;
while (*singleDriveString)
{
    // Dump drive information
    driveType = GetDriveType(singleDriveString);
    GetDiskFreeSpaceEx(singleDriveString, &freeSpace, NULL, NULL);

    switch (driveType)
    {
    case DRIVE_FIXED:
        driveTypeString = L"Hard disk";
        break;

    case DRIVE_CDROM:
        driveTypeString = L"CD/DVD";
        break;

    case DRIVE_REMOVABLE:
        driveTypeString = L"Removable";
        break;

    case DRIVE_REMOTE:
        driveTypeString = L"Network";
        break;

    default:
        driveTypeString = L"Unknown";
        break;
    }

    printf("%S - %S - %I64u GB free\n", singleDriveString, driveTypeString,
              freeSpace.QuadPart / 1024 / 1024 / 1024);

    // Move to next drive string
    // +1 is to move past the null at the end of the string.
    singleDriveString += lstrlen(singleDriveString) + 1;
}

free(driveStrings);

return 0;

} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...