c++ - 使用 C++ 在 Windows 下获取 Harddrrive 性能

标签 c++ winapi

我有一个问题分为几个部分,希望你能帮我解决。 我正在尝试编写一些代码来帮助我在时间间隔内获得硬盘性能。

这基本上就像在 Windows 中的任务管理器下使用性能,如下图所示: enter image description here

但实际读取/写入字节数而不是读取速度。

为了做到这一点,我遵循了一些指南并最终得到了以下代码:

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 库中定义的 long_integer。 我正在使用 long 它来保留结果。有没有更好的格式可以使用。 2-我注意到每次返回读取都在增加,这意味着读取计数器不会在每次读取时重置。它是否正确?以及如何解决?

提前致谢。

最佳答案

最安全的方法是让您的函数返回 LARGE_INTEGERint64_t(因为 LARGE_INTEGER 是带符号的 64 位整数)。

保存上一次读取的值并将返回值减去该值。

int64_t disk_read_since_last_check() noexcept {
    static int64_t previous_read=0;
    //...
    int64_t rv = dp.BytesRead.QuadPart - previous_read;
    previous_read = dp.BytesRead.QuadPart;
    return rv;
}

关于c++ - 使用 C++ 在 Windows 下获取 Harddrrive 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53363291/

相关文章:

c++ - C++ 中的顺序统计树

python - 文件未发布

c++ - 与遗留 TCHAR 代码接口(interface)的正确样式

c++ - 使用 GetFileVersionInfo API (C++) 以编程方式获取 .exe 的 ProductVersion

c++ - SDL 库 PNG 支持

c++ - 八进制文字怎么可能是负数?

c++ - 删除指向 vector 的指针

c++ - 浅拷贝或深拷贝或数组

c++ - 为什么 'CreateEvent' 创建的 HANDLE 在另一个进程中无效?

c++ - 如何从 C++(winapi) 中的资源加载 GDI::Image (GIF)?