如何使用直接IO编写一个带有扩展文件大小的小文件
how to use direct io write a small file with out extend file size
如何使用直接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);
这是一个现实世界中的问题,因为某些软件也可能会使用此文件,例如WebServer,它将获得错误的文件大小和对客户端的响应。
(必须是直接的,我有理由(
如何使用直接io编写一个带有扩展文件大小的小文件
对不起,您不能-O_DIRECT
需要I/O您的功能为512字节。假设KB
是1024字节,1.1 * 1024 = 1126.4
(这是一个奇怪的数字,因为它不会是整个字节(,因此您必须将其舍入到1536
才能使用O_DIRECT
,从而导致扩展。
您的选项仅限于:
- 执行
O_DIRECT
写入,然后将文件截断为正确的大小(这听起来好像是您在做什么(。 - 仅使用
O_DIRECT
写文件的完整块倍数,然后使用非O_DIRECT
写入最后一点。
如果这两个听起来都很糟糕,那么我只能将您指向 @ted-lyngmo的请求以获取更多信息:
"必须是直接的,我有我的理由" - 愿意分享这些?
O_DIRECT
带有大量使用规则...
我认为您可以在其MMAP SYSCALL中使用映射文件到内存中。还请查看此答案
相关文章:
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 我想通过带有C++和Python的插件创建一个可扩展的应用程序
- 如何构建一个 setup.py 来编译C++使用 Python、pybind11 和 Mingw-w64 的扩展?
- 为什么 MSVC C++编译器将一个简单的 Hello World 扩展为 4000 行汇编?
- 在另一个字符串中插入文件扩展名之前的字符串
- 如何将一个 QQuickItem 扩展作为子扩展添加到另一个 QQuickItem 扩展?
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- RXCPP:创建一个不关心可观察量输入类型的扩展
- 是否可以在不扩展初始宏的情况下将一个宏作为参数提供给另一个宏?
- 用一个额外的元素扩展 std::array 的每个 std::元组
- 如何使用直接IO编写一个带有扩展文件大小的小文件
- 如何将矢量大小扩展一个元素并用变量填充它
- 设计一个扩展良好的多线程应用程序
- 通过在上一个数组结束后立即存储下一个元素来扩展数组
- 为什么我不能在 c++ 类中声明一个空构造函数,该构造函数从一个具有私有构造函数的构造函数扩展而来
- Qt多个文件过滤器,强制一个扩展名
- GLEW只是一个扩展库,或者它也包含OpenGL ES 2.0实现
- 可变长度数组也是Clang中的一个扩展吗
- 如何为Internet Explorer创建一个扩展作为Exe-Com服务器
- 写入一个扩展名不同但名称与所读文件相同的文件