我有一个问题分为几个部分,希望你能帮我解决。
我试图编写一些代码来帮助我在间隔时间内获得硬盘性能。
它基本上类似于在Windows中的任务管理器下使用性能,如下图所示:
但实际读/写字节数不是读取速度。
为了做到这一点,我遵循了一些指南,最后得到了以下代码:
handle openTarget(pcwstr lpname)
{
处理目标;
htarget=createfile(lpname,
0,
文件共享读取文件共享写入,
无效的,
存在,
0,
零);
返回目标;
}
long total_disk_read()无异常{
handle htarget=openTarget(wszDrive);
if(htarget==invalid_handle_value)
{
日志(错误)<<“获取磁盘信息失败,代码:”<<getLastError();
返回0;
}
磁盘性能dp=0
dword cbobuffersize=sizeof(磁盘性能);
dword cbbytes返回=0;
lpvoid lpoutBuffer=(lpvoid)&dp;
如果(!)deviceiocontrol(htarget、ioctl_disk_performance、null、0、lpoutbuffer、cbufferSize和cbBytesReturned、null)
{
日志(错误)<<“获取磁盘性能信息失败,代码:”<<getLastError();
闭合手柄(htarget);
返回0;
}
否则{
闭合手柄(htarget);
返回dp.bytesread.quadpart;
}
}
< /代码>
现在我有两个问题:
1-我了解dp.bytesread返回在windows.h lib中定义的长_整数。
我用long it来保存结果。有更好的格式可以使用吗?
2-我注意到每次返回读数都在增加,这意味着每次读取时读取计数器都不会重置。这是正确的吗?如何解决?
事先谢谢。
它基本上类似于在Windows中的任务管理器下使用性能,如下图所示:
但实际读/写字节数不是读取速度。
为了做到这一点,我遵循了一些指南,最后得到了以下代码:
HANDLE OpenTarget(PCWSTR lpName)
{
HANDLE hTarget;
hTarget = CreateFile(lpName,
0,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
return hTarget;
}
long total_disk_read() noexcept {
HANDLE hTarget = OpenTarget(wszDrive);
if (hTarget == INVALID_HANDLE_VALUE)
{
LOG(error) << "Failed to get Disk info, code: " << GetLastError();
return 0 ;
}
DISK_PERFORMANCE dp = { 0 };
DWORD cbOutBufferSize = sizeof(DISK_PERFORMANCE);
DWORD cbBytesReturned = 0;
LPVOID lpOutBuffer = (LPVOID)&dp;
if (!DeviceIoControl(hTarget, IOCTL_DISK_PERFORMANCE, NULL, 0, lpOutBuffer, cbOutBufferSize, &cbBytesReturned, NULL))
{
LOG(error) << "Failed to get Disk Performance info, code: " << GetLastError();
CloseHandle(hTarget);
return 0 ;
}
else {
CloseHandle(hTarget);
return dp.BytesRead.QuadPart;
}
}
现在我有两个问题:
1-我了解dp.bytesread返回在windows.h lib中定义的长_整数。
我用long it来保存结果。有更好的格式可以使用吗?
2-我注意到每次返回读数都在增加,这意味着每次读取时读取计数器都不会重置。这是正确的吗?如何解决?
事先谢谢。