Unbuffer文件写入是符合unicode和跨平台的
Unbuffer file write that is unicode compliant and cross-plat
我正在开发一些加密应用程序,需要进行一些无缓冲的文件写入。
我不知道我能用什么功能。
需要明确的是,我正在实现一个用于写入的回调函数和一个用于读取的回调函数,当操作系统中的任何第三方应用程序想要写入或读取hdd时,这些函数将处理写入或读取
需求:
-我需要处理具有unicode名称的文件
-我需要以无缓冲模式写作
-我需要为Windows、Linux、Mac做这件事。
我使用C++和Qt。虽然QFile确实有在非缓冲模式下打开文件的语法,但文档说它不适用于Windows(也就是说,QFile在Windows中总是处于缓冲模式)。
这导致我的应用程序因Windows延迟写入错误而崩溃。理想情况下,我不想为每种类型的操作系统使用单独的函数(+lib),但我意识到,在寻求跨平台兼容性的过程中,我的选择可能不太好。无论如何,我期待着关于我应该为每个平台使用什么功能的建议,如果没有一个可以为所有3个平台使用的功能的话。
- 对于Windows,您需要带有
FILE_FLAG_NO_BUFFERING
标志的CreateFile()
函数 - 在Linux上,您需要带有
O_DIRECT
选项的open()
,但请注意,只有在2.4.10内核之后才支持它 - 在OSX上,每次写入后都需要调用
fsync()
但我必须提醒您,无缓冲的I/O并不能最大限度地减少磁盘I/O,而且很可能会大大降低应用程序的性能。除非你真的知道自己在做什么,知道操作系统缓冲区如何影响性能,并清楚地解释为什么无缓冲区的I/O会更快,否则不要进行直接I/O。如果你仍然想继续,不要忘记在之前和之后测量性能。你做错误优化,甚至让事情变得更糟的几率是90%。
至于Unicode合规性,这并不重要。写入需要一个内存地址和要写入的字节数。您可以编写unicode、ASCII、任何二进制数据等。如果使用unicode,您只需要记住不要将字符串长度与字符串大小混淆。
祝你好运!
相关文章:
- C++ - Unicode Newline
- 通过网络、跨平台传递std::变体是否安全
- 如何将unicode字符串从C++传递到delphi
- 如何跨平台将二进制资源构建到程序中?
- ascii 和 unicode 在处理级别有什么区别吗?
- 无法从 std::string 中提取C++ Unicode 符号
- 以跨平台的方式将图像源路径从C++发送到 QML
- 跨平台 GPU 计算
- MinGW64 - Unicode 源文件错误?
- 使用 Visual Studio 2019 编译 Unicode
- 在哪里存储跨平台C++应用存储?
- 将ANSI C字符串转换为UNICODE
- 如何从 oracle 数据库 c++ 读取 unicode
- 在特定 Unicode 路径中创建文件
- 如何将外部依赖引入跨平台CMake项目?
- 如何存储 unicode 字符并将其输出到文件?
- C++ wmain 函数错误时使用 Unicode
- C++:打印 Unicode 字符
- Unbuffer文件写入是符合unicode和跨平台的
- 用unicode文件名保存文件的问题-如何以跨平台的方式正确保存UTF-8文件名