如何使用直接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/