【发布时间】:2011-06-07 05:15:37
【问题描述】:
我需要实现一个从磁盘流式传输数据的应用程序。重要的是数据吞吐量相当稳定并且不会被磁盘上的任何其他活动中断。
从 Windows Vista 开始,专门为此目的引入了 GetFileBandwidthReservation() 和 SetFileBandwidthReservation() 函数。但是,我无法让它发挥作用。我已经在互联网上搜索过,但找不到太多关于这方面的信息(而且网上似乎没有工作代码示例)。
要重现的代码:
HANDLE h = ::CreateFile(L"D:\\testfile", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
DWORD periodMilliseconds, bytesPerPeriod, transferSize, numOutstandingRequests;
BOOL discardable;
BOOL result = ::GetFileBandwidthReservation(h, &periodMilliseconds, &bytesPerPeriod,
&discardable, &transferSize, &numOutstandingRequests);
if (result == FALSE) // result is always false!
{
DWORD reason = ::GetLastError(); // reason is always 1!
std::cout << "Error: " << reason << std::endl;
}
result = ::CloseHandle(h);
对 GetFileBandwidthReservation 的调用总是返回 FALSE,表示失败。 GetLastError 返回 1 这不是很有帮助。如果尝试调用 *Set*FileBandwithReservation 我会得到相同的结果。
我正在使用 Windows Server 2008 SP2(32 位)的 PC 上对此进行测试。
有人知道我做错了什么吗?任何帮助将不胜感激。
【问题讨论】:
-
您从哪里获得 Server 2008 的 SP3?
-
GetLastError() 返回什么?
-
修正错字:SP2 而不是 SP3
-
GetLastError 返回 1 很有帮助。这意味着设备驱动程序不支持该功能。我认为韩的回答是正确的。
标签: c++ windows performance winapi io