我想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
:该函数使用DeviceIoControl
和IOCTL_FILE_DEVICE_FILE_SYSTEM
来获取物理磁盘的缓存状态。
GetDiskDriveInfo
:该函数使用GetLogicalDrives
获取逻辑磁盘驱动器的位图,然后使用GetVolumeInformationA
和GetDiskFreeSpaceExA
来获取每个逻辑磁盘的详细信息,包括卷标、文件系统、序列号以及总体和可用空间。
GetHardDiskSpeed
:该函数使用RegOpenKeyEx
和RegQueryValueEx
来获取硬盘速度信息,对应注册表中的HARDWARE\DEVICEMAP\Scsi\Scsi Port 0
键。
大闲人,天天跟这些打交道