Winapi 将最后N个字节写入使用文件\u标志\u无\u缓冲打开的文件

Winapi 将最后N个字节写入使用文件\u标志\u无\u缓冲打开的文件,winapi,output-buffering,writefile,io-buffering,Winapi,Output Buffering,Writefile,Io Buffering,在将大量顺序数据写入磁盘时,我发现有一个4MB的内部缓冲区,在打开文件进行写入时,我指定了[file\u FLAG\u NO\u BUFFERING][1],以便使用我的内部缓冲区 但这也要求写入完整的扇区块(在我的机器上为512字节) 如何编写最后的N正如评论所建议的那样,以这种方式编写文件可能不是现实世界中最好的解决方案。但是如果使用FILE\u FLAG\u NO\u BUFFERING进行写入, 是将文件标记为比整个块短的方式 int data_len = len(str); int l

在将大量顺序数据写入磁盘时,我发现有一个4MB的内部缓冲区,在打开文件进行写入时,我指定了
[file\u FLAG\u NO\u BUFFERING][1]
,以便使用我的内部缓冲区

但这也要求写入完整的扇区块(在我的机器上为512字节)


如何编写最后的N正如评论所建议的那样,以这种方式编写文件可能不是现实世界中最好的解决方案。但是如果使用
FILE\u FLAG\u NO\u BUFFERING
进行写入,
是将文件标记为比整个块短的方式

int data_len = len(str);
int len_last_block = BLOCKSIZE%datalen;
int padding_to_fill_block = (data_last_block == BLOCKSIZE ? 0 : (BLOCKSIZE-len_last_block);
str.append('\0', padding_to_fill_block);

ULONG bytes_written = 0;
::WriteFile(hFile, data, data_len+padding_to_fill_block, &bytes_written, NULL));
m_filesize += bytes_written;;

LARGE_INTEGER end_of_file_pos;
end_of_file_pos.QuadPart = m_filesize - padding_to_fill_block;
if (!::SetFileInformationByHandle(hFile, FileEndOfFileInfo, &end_of_file_pos, sizeof(end_of_file_pos)))
{
    HRESULT hr = ::GetLastErrorMessage();
}

不可以。使用文件\u标志\u否\u缓冲的几率非常低。它不是为了“使用我的内部缓冲区”。。一旦您了解了发生的情况,您可能就会明白为什么建议的优化变成了负数。要写入最后一个区块,您仍然需要写入一个完整的扇区,然后使用
SetEndOfFile
调整文件的大小。是的,它需要。您是否介意分享使用
文件\u标志\u无缓冲的原因