Как использовать резервирование пропускной способности файла (запланированный ввод-вывод файла) в Windows - PullRequest
4 голосов
/ 11 января 2011

Мне нужно реализовать приложение для потоковой передачи данных с диска.Важно, чтобы пропускная способность данных была довольно постоянной и не прерывалась никакими другими действиями на диске.

Начиная с 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, что не очень полезно.Если попытаться вызвать * Установить * FileBandwithReservation, я получу тот же результат.

Я проверяю это на ПК с Windows Server 2008 SP2 (32-разрядная версия).

Кто-нибудь имеет представление о том, что я делаю неправильно?Любая помощь будет принята с благодарностью.

1 Ответ

3 голосов
/ 11 января 2011

Для этого требуется поддержка драйвера дискового устройства.Тип драйвера, который вы найдете на высококлассном сервере, а не на уровне потребителя.Задайте больше вопросов об этом на serverfault.com

...