c++ - 如何使用直接io写入小文件而不扩展文件大小

标签 c++ c file

如何使用直接io写入小文件而不改变文件大小。

假设我有一个文件,文件大小为1.1KB,我使用直接io读取文件,并更改一些数据,然后写入文件......

见下文

//open file with O_DIRECT
handle_ = open("1.html", O_RDWR | O_DIRECT | O_SYNC | O_LARGEFILE,0777))

//file size is 1.1KB (i read 4KB)
pread64(handle_,buffer,4096,0);

memcpy(buffer,"11111",5);

//error (512b Aligned)
pwrite64(handle_,buffer,1.1KB,0);


//OK,but file size has been extended to 4KB 
pwrite64(handle_,buffer,4KB,0);

这是一个现实世界的问题,因为某些软件也可能使用此文件,例如网络服务器,它会得到错误的文件大小并向客户端响应更大的文件。

(一定是直接io,我有我的理由)

最佳答案

how to use direct io write a small file with out extend file size

抱歉,您不能 - O_DIRECT 要求您执行的 I/O 是 512 字节对齐的。假设 KB 为 1024 字节,1.1 * 1024 = 1126.4 (这是一个奇怪的数字,因为它不是一个完整的字节),因此您必须将其四舍五入为1536 使用 O_DIRECT 从而导致扩展。

您的选择仅限于:

  • 执行O_DIRECT写入,然后将文件截断为正确的大小(听起来这就是您最终要做的事情)。
  • 使用 O_DIRECT 仅写入文件的完整 block 倍数,然后使用非 O_DIRECT 写入写入最后一点。

如果这两个听起来都很糟糕,那么我只能向你指出 @ted-lyngmo's request for more information :

"must be direct io,i have my reasons" - care to share those?

O_DIRECT 附带大量使用规则...

关于c++ - 如何使用直接io写入小文件而不扩展文件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57305878/

相关文章:

c++ - 基于图的图像分割

c++ - 使用引用的 constexpr 静态成员作为模板参数

c - C 中的文件 I/O 管理

c++ - 读取 txt 文件时出现 "Debug Assertion Failed"

c++ - C++ 中的线程同步

C++如何检查输入浮点变量的有效输入

char* 与 const char* 作为参数

c++ - 格式 ‘%lf’ 需要类型为 ‘double *’ 的参数,但参数 2 的类型为‘polyTerm **

java - ArrayList 从文件中读取行并分配它们

javascript - 如何在php中将上传的文件发送到电子邮件