c++ - 如何使用 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);
. 如果有任何替代想法可用,请提出建议。
解决方案
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
标志,因为使用它您只能写入扇区大小的整数。
推荐阅读
- rust - 哪个可见性参数提供结构和函数,哪些在子模块中是可见的?
- graphql - GraphQL 查询在查询 Strapi API 时无法提供服务器当前时间戳
- javascript - 在具有重复值的数组元素中查找常见模式
- excel - Excel 公式 - 引用已关闭工作簿上的单元格
- ios - 在我的 iOS 应用中安装“pod Firebase/Firestore”时出错
- autodesk-forge - 伪造查看器标记扩展可防止多种类型的工具
- powershell - 如何将具有不同值的相同键添加到powershell中的哈希表?
- visual-studio-project - Visual Studio项目,如何检查项目是VB还是C#
- node.js - 为什么 .env 文件存在时 dotenv 返回未定义?
- node.js - 如何验证最终用户身份验证令牌(使用 Firebase 身份验证)以调用谷歌云运行端点?