c++获取获取物理磁盘的缓存和机械磁盘的转速和逻辑磁盘的Inode可用和inode使用率

我想c++获取window的物理磁盘的缓存(物理磁盘是disk0和disk1这种),机械磁盘的转速和逻辑磁盘的Inode可用和inode使用率(尽量能都获取到信息)

你们领导安排的啥工作啊,想一出是一出,尽搞这些根本没啥用的

不用天天在这里发布一样的问题,你已经开了10个相同话题的,有问题原帖下面继续评论就行

要在C++中获取Windows物理磁盘的缓存、机械磁盘的转速以及逻辑磁盘的Inode可用和Inode使用率,可以使用Windows API来实现。

首先,获取物理磁盘的缓存信息,可以使用GetLogicalDriveStrings函数获取系统上的所有逻辑磁盘的列表,然后针对每个逻辑磁盘,使用GetDriveType函数来判断是否为物理磁盘。

#include <iostream>
#include <vector>
#include <Windows.h>

int main() {
    DWORD bufferSize = GetLogicalDriveStrings(0, NULL); // 获取所需缓冲区大小
    std::vector<TCHAR> buffer(bufferSize, 0);
    
    GetLogicalDriveStrings(bufferSize, &buffer[0]); // 获取逻辑磁盘列表
    
    for (int i = 0; i < buffer.size(); i += 4) {
        TCHAR driveLetter[4] = { buffer[i], buffer[i + 1], '\\', 0 };
        
        if (GetDriveType(driveLetter) == DRIVE_FIXED) { // 判断是否为物理磁盘
            // 获取物理磁盘缓存信息
            ULONGLONG cacheSize;
            if (GetVolumeInformation(driveLetter, NULL, 0, NULL, NULL,
                NULL, NULL, NULL, &cacheSize)) {
                std::cout << "Physical Disk " << driveLetter << " Cache Size: " << cacheSize << std::endl;
            }
        }
    }
    
    return 0;
}

接下来,获取机械磁盘的转速,可以使用WMI (Windows Management Instrumentation)。使用Win32_DiskDrive类可以检索磁盘驱动器的属性,其中包括转速。

#include <iostream>
#include <comdef.h>
#include <Wbemidl.h>

#pragma comment(lib, "wbemuuid.lib")

int main() {
    HRESULT hres;

    // 初始化COM库
    hres = CoInitializeEx(0, COINIT_MULTITHREADED);
    if (FAILED(hres)) {
        std::cerr << "Failed to initialize COM library. Error code: " << hres << std::endl;
        return 1;
    }

    // 设置COM安全性级别
    hres = CoInitializeSecurity(
        NULL,
        -1,
        NULL,
        NULL,
        RPC_C_AUTHN_LEVEL_DEFAULT,
        RPC_C_IMP_LEVEL_IMPERSONATE,
        NULL,
        EOAC_NONE,
        NULL
    );
    if (FAILED(hres)) {
        std::cerr << "Failed to initialize security. Error code: " << hres << std::endl;
        CoUninitialize();
        return 1;
    }
    
    // 获取WMI服务对象
    IWbemLocator* pLoc = NULL;
    hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc);
    if (FAILED(hres)) {
        std::cerr << "Failed to create IWbemLocator object. Error code: " << hres << std::endl;
        CoUninitialize();
        return 1;
    }
    
    IWbemServices* pSvc = NULL;
    hres = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc);
    if (FAILED(hres)) {
        std::cerr << "Failed to connect to IWbemServices object. Error code: " << hres << std::endl;
        pLoc->Release();
        CoUninitialize();
        return 1;
    }
    
    hres = CoSetProxyBlanket(
        pSvc,
        RPC_C_AUTHN_WINNT,
        RPC_C_AUTHZ_NONE,
        NULL,
        RPC_C_AUTHN_LEVEL_CALL,
        RPC_C_IMP_LEVEL_IMPERSONATE,
        NULL,
        EOAC_NONE
    );
    if (FAILED(hres)) {
        std::cerr << "Failed to set proxy blanket. Error code: " << hres << std::endl;
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return 1;
    }
    
    // 查询WMI数据
    IEnumWbemClassObject* pEnumerator = NULL;
    hres = pSvc->ExecQuery(
        bstr_t("WQL"),
        bstr_t("SELECT * FROM Win32_DiskDrive"),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
        NULL,
        &pEnumerator
    );
    if (FAILED(hres)) {
        std::cerr << "Failed to execute query. Error code: " << hres << std::endl;
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return 1;
    }
    
    // 遍历查询结果
    IWbemClassObject* pclsObj = NULL;
    ULONG uReturn = 0;

    while (pEnumerator) {
        hres = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
        if (0 == uReturn) {
            break;
        }
        
        VARIANT vtProp;
        hres = pclsObj->Get(L"MediaType", 0, &vtProp, 0, 0); // 获取媒体类型
        if (!FAILED(hres) && vtProp.vt == VT_BSTR && wcscmp(vtProp.bstrVal, L"HDD") == 0) {
            hres = pclsObj->Get(L"Caption", 0, &vtProp, 0, 0); // 获取磁盘名称
            if (!FAILED(hres) && vtProp.vt == VT_BSTR) {
                std::wstring diskName = vtProp.bstrVal;
                std::wcout << "Mechanical Disk: " << diskName << std::endl;
                
                hres = pclsObj->Get(L"Model", 0, &vtProp, 0, 0); // 获取磁盘

要获取Windows上物理磁盘的缓存信息、机械磁盘的转速以及逻辑磁盘的inode可用和inode使用率,你可以使用Win32 API来实现。

下面是一个示例代码,展示了如何在C++中获取这些信息:

#include <iostream>
#include <Windows.h>
#include <Winioctl.h>

void GetDiskCacheStatus()
{
    DWORD bufferSize = 0;
    SYSTEM_CACHE_INFORMATION cacheInformation;

    // 获取缓存信息所需的缓冲区大小
    if (!DeviceIoControl(GetStdHandle(STD_OUTPUT_HANDLE),
        IOCTL_FILE_DEVICE_FILE_SYSTEM, FSCTL_QUERY_SYSTEM_CACHE_INFORMATION,
        NULL, 0, &cacheInformation, sizeof(cacheInformation), &bufferSize, NULL))
    {
        std::cerr << "Failed to get disk cache status." << std::endl;
        return;
    }

    std::cout << "Cache Enabled: " << (cacheInformation.Flags & CACHE_FLAGS_DISABLE) ? "No" : "Yes" << std::endl;
}

void GetDiskDriveInfo()
{
    DWORD drivesBits = GetLogicalDrives();
    
    // 遍历每个逻辑磁盘
    for (char driveLetter = 'A'; driveLetter <= 'Z'; ++driveLetter)
    {
        if (drivesBits & 1)
        {
            std::string drivePath = "\\\\.\\" + std::string(1, driveLetter) + ":";
            std::cout << "Drive: " << drivePath << std::endl;
            
            // 获取驱动器属性
            char volumeName[MAX_PATH + 1];
            char fileSystemName[MAX_PATH + 1];
            DWORD serialNumber = 0, maxComponentLength = 0, fileSystemFlags = 0;
            if (GetVolumeInformationA(drivePath.c_str(), volumeName, sizeof(volumeName),
                &serialNumber, &maxComponentLength, &fileSystemFlags, fileSystemName, sizeof(fileSystemName)))
            {
                std::cout << "Volume Name: " << volumeName << std::endl;
                std::cout << "File System: " << fileSystemName << std::endl;
                std::cout << "Serial Number: " << serialNumber << std::endl;
            }
            
            // 获取磁盘空间信息
            ULARGE_INTEGER totalBytes, freeBytes;
            if (GetDiskFreeSpaceExA(drivePath.c_str(), NULL, &totalBytes, &freeBytes))
            {
                std::cout << "Total Space: " << totalBytes.QuadPart / (1024 * 1024) << " MB" << std::endl;
                std::cout << "Free Space: " << freeBytes.QuadPart / (1024 * 1024) << " MB" << std::endl;
            }
        }
        drivesBits >>= 1;
    }

}

void GetHardDiskSpeed()
{
    HKEY hKey;
    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\Scsi\\Scsi Port 0", 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
    {
        char buffer[MAX_PATH];
        DWORD bufferSize = sizeof(buffer);
        
        // 获取硬盘速度信息
        if (RegQueryValueEx(hKey, "Identifier", NULL, NULL, reinterpret_cast<LPBYTE>(buffer), &bufferSize) == ERROR_SUCCESS)
        {
            std::cout << "Hard Disk Speed: " << buffer << std::endl;
        }
        
        RegCloseKey(hKey);
    }
}

int main()
{
    GetDiskCacheStatus();
    GetDiskDriveInfo();
    GetHardDiskSpeed();

    return 0;
}

这个示例代码使用了以下几个函数来获取磁盘相关的信息:

  • GetDiskCacheStatus:该函数使用DeviceIoControlIOCTL_FILE_DEVICE_FILE_SYSTEM来获取物理磁盘的缓存状态。

  • GetDiskDriveInfo:该函数使用GetLogicalDrives获取逻辑磁盘驱动器的位图,然后使用GetVolumeInformationAGetDiskFreeSpaceExA来获取每个逻辑磁盘的详细信息,包括卷标、文件系统、序列号以及总体和可用空间。

  • GetHardDiskSpeed:该函数使用RegOpenKeyExRegQueryValueEx来获取硬盘速度信息,对应注册表中的HARDWARE\DEVICEMAP\Scsi\Scsi Port 0键。

大闲人,天天跟这些打交道