Параметр lpNumberOfBytesWritten функции WriteFile - PullRequest
3 голосов
/ 27 июня 2011

MSDN говорит,

При записи в неблокирующем режиме байтов дескриптор канала с недостаточным буферным пространством, WriteFile возвращает TRUE с * lpNumberOfBytesWritten

Для файла или сокета ( не труба ), может * lpNumberOfBytesWritten меньше, чем nNumberOfBytesToWrite (и результат TRUE), когда я вызываю функцию синхронно .

Если так, почему (и когда) соответствующий драйвер завершает IRP таким образом?

Когда я вижу код ниже, я всегда беспокоюсь о том, «что если * lpNumberOfBytesWritten

BOOL fOk = WriteFile(hFileOrSocket, ...); // Synchronously
if (fOk)
{
  // It assumes everything is fine
}

Разве мне не нужно беспокоиться об этом?

Ответы [ 2 ]

2 голосов
/ 27 июня 2011

AFAIK, если дескриптор файла открыт для синхронной записи - описанная вами ситуация (*lpNumberOfBytesWritten < BytesToWritten) никогда не произойдет.

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

Не следует путать с перекрывающимся вводом / выводом.Там вы планируете ввод-вывод, и он завершается асинхронно (базовым драйвером).

0 голосов
/ 28 июня 2011

"Для файла или сокета (не трубы)"

Для файла это должно быть довольно легко представить.

Также легко экспериментировать. Создайте раздел жесткого диска размером 100 МБ, откройте файл, запишите 99 МБ, а затем попробуйте записать еще 99 МБ. Эксперимент может быть ненадежным, поскольку некоторые версии Windows могут возвращать FALSE, но легко представить, что некоторые другие версии Windows могут возвращать TRUE с * lpNumberOfBytesWritten меньше, чем nNumberOfBytesToWrite.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...