Для тестирования и обеспечения того, чтобы у меня было все, чтобы я мог начать масштабирование позже, я пытаюсь создать дескриптор файла, записать данный буфер байтов в этот дескриптор файла, а затем прочитать часть этого файл в новый тестовый буфер.Createfile2, ReadFile и WriteFile; почему нет ReadFile, читающего то, что я написал в WriteFile?
У меня есть код:
const size_t vSize = 0x10000;
std::vector<byte> buffer(vSize, 0);
for (int i = 0; i != vSize; ++i)
{
buffer[i] = i & 0xff;
}
std::wstring path = ApplicationData::Current->LocalFolder->Path->Data();
std::wstring testFileName = path + std::wstring(L"\\TestVariablySized");
_CREATEFILE2_EXTENDED_PARAMETERS extend = { 0 };
extend.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS);
extend.dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
extend.dwFileFlags = FILE_FLAG_NO_BUFFERING;
extend.dwSecurityQosFlags = SECURITY_ANONYMOUS;
extend.lpSecurityAttributes = nullptr;
extend.hTemplateFile = nullptr;
HANDLE hMappedFile = CreateFile2(
testFileName.c_str(),
GENERIC_READ | GENERIC_WRITE,
0,
OPEN_ALWAYS,
&extend);
_OVERLAPPED positionalData;
positionalData.Offset = 0;
positionalData.OffsetHigh = 0;
positionalData.hEvent = 0;
WriteFile(
hMappedFile,
&buffer[0],
vSize,
NULL,
positionalData);
std::vector<byte> testBuffer(128);
ReadFile(
hMappedFile,
(LPVOID)&testBuffer[0],
128,
NULL,
&positionalData);
К сожалению, когда я поставил точку останова после проверки и посмотреть, что на самом деле в testBuffer, я считаю, что это все нули. Я также пробовал все вышеперечисленное без positionalData (т. Е. Заменяя его NULL в вызовах WriteFile/ReadFile), но это не меняет результат. Аналогично, я пробовал это с помощью NULL вместо расширенных параметров для CreateFile2, того же результата.
В конечном итоге я хочу иметь возможность выбрать произвольное местоположение в заданном файле для чтения байтов, поэтому, если я делаю что-то странное с помощью positionalData, сообщите мне.
На данный момент я не знаю, есть ли проблема в CreateFile2, ReadFile, WriteFile или их комбинации. Ваша помощь очень ценится!
Редактировать: Оказывается, что ReadFile() возвращает False, а последний код ошибки - 0x57 (87) - ERROR_INVALID_PARAMETER. В настоящее время googling вокруг этого, но в случае, если я не могу получить ответ, меня все еще интересует чтение предложений. Мне сразу не сразу понятно, что я сделал не так, но, по моему предположению, я сделал ошибку с positionalData каким-то образом.
окончательное изменение: удаление FILE_FLAG_NO_BUFFERING выполнило задание в конце. Спасибо!
'ReadFile()' возвращает BOOL, указывающее на успех или ошибку. Проверьте, является ли это ЛОЖЬ, и если это так, вызовите 'GetLastError()', чтобы найти код ошибки. – MrEricSir
Спасибо за подсказку. ReadFile() действительно возвращал false, и он дает мне код ошибки 0x57 (87). На это прямо сейчас. – MNagy
Ошибка 87 - это «ERROR_INVALID_PARAMETER». 'ReadFile()' не работает, потому что вы не следуете [ограничениям, установленным флагом 'FILE_FLAG_NO_BUFFERING'] (https://msdn.microsoft.com/en-us/library/windows/desktop/cc644950.aspx). Если вы избавитесь от этого флага, тогда код, скорее всего, будет работать. В противном случае обновите код, чтобы правильно следовать правилам. –