代码之家  ›  专栏  ›  技术社区  ›  user2320492

用C++实现Windows下的硬盘性能

  •  2
  • user2320492  · 技术社区  · 6 年前

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

    它基本上类似于在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中的任务管理器下使用性能,如下图所示: 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 lib中定义的长_整数。 我用long it来保存结果。有更好的格式可以使用吗? 2-我注意到每次返回读数都在增加,这意味着每次读取时读取计数器都不会重置。这是正确的吗?如何解决?

    事先谢谢。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Ted Lyngmo    6 年前

    最安全的方法是让函数返回 LARGE_INTEGER 或A int64_t (自) 大整数 是有符号的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;
    }