Каждый раз, когда вызывается моя функция, она перезаписывается в файл. Пожалуйста, обратите внимание, я открываю файл в небуферизованном режиме, используя флаги ниже.
FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH
Если я использую простой буферный режим, он работает нормально.
FILE_ATTRIBUTE_NORMAL
Я получаю следующую ошибку в небуферизованном режиме.
** ОШИБКА ** Сбой CreateFile: параметр неверен.
Пожалуйста, найдите фрагменты кода ниже. Этот фрагмент кода вызывается много раз.
HANDLE hFile;
LPCWSTR file_path = convertCharArrayToLPCWSTR(UNBUFFERED_FILE);
hFile = CreateFile(file_path,
FILE_APPEND_DATA,
FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH,
NULL
);
if (hFile == INVALID_HANDLE_VALUE)
{
std::cout << "Unable to open/create file for writing" << std::endl;
PrintError(TEXT("CreateFile failed"));
}Data *data = new Data();
DWORD dwBytesToWrite = sizeof(Data);
DWORD dwBytesWritten = 0;
BOOL bErrorFlag = FALSE;bErrorFlag = WriteFile(
hFile, // open file handle
data, // start of data to write
dwBytesToWrite, // number of bytes to write
&dwBytesWritten, // number of bytes that were written
NULL);
if (bErrorFlag == FALSE)
{
std::cout << "Unable to write to file" << std::endl;
PrintError(TEXT("Unable to write to file"));
}
if (dwBytesToWrite != dwBytesWritten)
{
std::cout << "Error in writing: Whole data not written" << std::endl;
PrintError(TEXT("Error in writing: Whole data not written"));
}
CloseHandle(hFile);
.
Пожалуйста, предложите, если альтернативная идея доступна.
от NtCreateFile
FILE_NO_INTERMEDIATE_BUFFERING
Файл не может быть кэширован или буферизирован во внутреннем драйвере
буферы. Этот флаг несовместим с DesiredAccess
параметраFILE_APPEND_DATA
флаг.
поэтому, когда вы звоните
CreateFile(file_path,
FILE_APPEND_DATA, // !!
FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
FILE_FLAG_NO_BUFFERING /*!!*/| FILE_FLAG_WRITE_THROUGH,
NULL
);
ты используешь FILE_FLAG_NO_BUFFERING
(сопоставлено с FILE_NO_INTERMEDIATE_BUFFERING
) с FILE_APPEND_DATA
— ты и должен получить ERROR_INVALID_PARAMETER
, вам нужно удалить один флаг. я предлагаю удалить FILE_FLAG_NO_BUFFERING
флаг, потому что с его помощью вы можете написать только интеграл от размера сектора.
Других решений пока нет …