首页 > 解决方案 > 如何使用 CreateFile 在 Windows 中以 UnBuffered 模式追加文件

问题描述

每次调用我的函数时,它都会覆盖文件。请注意,我正在使用以下标志以无缓冲模式打开文件。

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

. 如果有任何替代想法可用,请提出建议。

标签: c++filewinapicreatefileunbuffered

解决方案


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标志,因为使用它您只能写入扇区大小的整数。


推荐阅读