Как добавить файл в Windows в режиме без буферизации с помощью CreateFile - PullRequest
0 голосов
/ 25 сентября 2018

Каждый раз, когда вызывается моя функция, она перезаписывается в файл.Пожалуйста, обратите внимание, что я открываю файл в небуферизованном режиме, используя следующие флаги.

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);

.Пожалуйста, предложите, если альтернативная идея доступна.

1 Ответ

0 голосов
/ 25 сентября 2018

из NtCreateFile

FILE_NO_INTERMEDIATE_BUFFERING

Файл не может быть кэширован или буферизован во внутренних буферах драйвера.Этот флаг несовместим с флагом FILE_APPEND_DATA параметра DesiredAccess .

, поэтому при вызове

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 флаг, потому что с его помощью вы можете написать только интеграл от размера сектора.

...