/
eastopener
/
operationDisk
Обзор
Документация
Войти
/
eastopener
/
operationDisk
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
DiskInfo.cpp
90 строк
4 KB
Demin
Before_service
04 мар 2026, 11:40
04 мар 2026, 11:40
0ae2e95
Код
Авторство
О чём код?
#include "DiskInfo.h" #include <windows.h> #include <fileapi.h> #include <winioctl.h> #include <string> #include <vector> #include <set> std::vector<DiskInfo> DiskInfoReader::GetDiskInfo() { std::vector<DiskInfo> disks; // Список известных файловых систем static const std::set<std::wstring> knownFileSystems = { L"NTFS", L"FAT32", L"exFAT", L"FAT", L"ReFS", L"CDFS", L"UDF", L"EXT4", L"EXT3", L"EXT2" }; DWORD drivesMask = ::GetLogicalDrives(); for (char drive = 'A'; drive <= 'Z'; ++drive) { // Пропускаем диски C и D if (drive == 'C' || drive == 'D') { continue; } if (drivesMask & (1 << (drive - 'A'))) { DiskInfo info; std::wstring rootPath = L" :\\"; rootPath[0] = drive; info.isWritable = true; // Все оставшиеся диски считаем доступными для записи // ПОЛУЧАЕМ НАЗВАНИЕ ДИСКА (МЕТКУ ТОМА) - НОВЫЙ КОД! wchar_t volumeName[MAX_PATH + 1] = {0}; if (GetVolumeInformationW( rootPath.c_str(), // Корневой путь диска volumeName, // Буфер для названия диска MAX_PATH, // Размер буфера NULL, // Серийный номер (не нужен) NULL, // Максимальная длина имени (не нужна) NULL, // Флаги (не нужны) NULL, // Имя ФС (не нужно) 0 // Размер буфера ФС )) { if (wcslen(volumeName) > 0) { info.volumeName = volumeName; // Сохраняем название диска } else { info.volumeName = L"Без названия"; // Если метки нет } } else { info.volumeName = L"Не удалось получить название"; } // Получаем информацию о свободном месте ULARGE_INTEGER freeBytesAvailable, totalBytes, totalFreeBytes; if (GetDiskFreeSpaceExW(rootPath.c_str(), &freeBytesAvailable, &totalBytes, &totalFreeBytes)) { info.totalSpace = totalBytes.QuadPart; info.freeSpace = totalFreeBytes.QuadPart; info.usedSpace = totalBytes.QuadPart - totalFreeBytes.QuadPart; } // Получаем информацию о файловой системе wchar_t fileSystemName[MAX_PATH]; DWORD serialNumber, maxComponentLength, fileSystemFlags; if (GetVolumeInformationW( rootPath.c_str(), NULL, 0, &serialNumber, &maxComponentLength, &fileSystemFlags, fileSystemName, MAX_PATH )) { std::wstring fs(fileSystemName); if (knownFileSystems.find(fs) != knownFileSystems.end()) { info.fileSystem = fs; } else { info.fileSystem = L"-"; // Прочерк для неизвестных ФС } } else { info.fileSystem = L"-"; // Прочерк, если не удалось получить информацию } info.name = rootPath; disks.push_back(info); } } return disks; }