使用标准库的IO还是windows文件IO,该如何解决
使用标准库的IO还是windows文件IO
楼主想编写一个简单的数据库,现在碰到一个问题。使用什么函数来打开文件,是使用标准库的的fopen之类的函数,还是使用windows api函数,我有查看sqlite的源码,它那边是使用的windows api函数createfile之类的函数。
为什么使用api函数,而不是使用标准库的函数?
------解决方案--------------------
数据库要共享访问,要加锁,必须用Windows API吧
------解决方案--------------------
标准库内部会调用各个操作系统自己的API。其实都是一样的。
------解决方案--------------------
如果不是因为需要跨平台就尽量用系统API,标准库的文件函数,一个是不支持复杂的文件系统属性和安全权限控制,另一个是如果你写32位的程序,系统API支持64位的文件长度而标准库的只支持最多4G不到。假如你想写个文件下载器什么的,下个“稍微”大点的文件都下不了
------解决方案--------------------
正好相反。
一般靠谱的策略是如果不确定你是不是要用某些功能,那就不要用;有强大的、封装层次较低的接口和较弱的、封装层次较高的接口,尽量使用后者。避免用得稀里糊涂的同时在可移植性问题上能降低风险;否则就是无谓增加环境限制的需求,自缚手脚。
标准库I/O不是纯粹的兼容层。它有自己的设计和功能特性(比如缓冲)。用不用得到当然也需要考虑进去。不过,按需关掉缓冲对于敢用底层API的用户来说应该没什么难度。
对于LZ的问题,一般来说当然标准库I/O就很可能靠不住了,理由倒是一样:功能不够用。性能上也比较微妙。
不过貌似LZ只是想要简单的文件数据库?如果不懂知道什么细节,用标准库I/O做个原型倒也可行,反正就算以后要改也应该比反过来加兼容层容易。
------解决方案--------------------
因为windows下的fopen最终调用CreateFile
楼主想编写一个简单的数据库,现在碰到一个问题。使用什么函数来打开文件,是使用标准库的的fopen之类的函数,还是使用windows api函数,我有查看sqlite的源码,它那边是使用的windows api函数createfile之类的函数。
为什么使用api函数,而不是使用标准库的函数?
------解决方案--------------------
数据库要共享访问,要加锁,必须用Windows API吧
------解决方案--------------------
标准库内部会调用各个操作系统自己的API。其实都是一样的。
------解决方案--------------------
如果不是因为需要跨平台就尽量用系统API,标准库的文件函数,一个是不支持复杂的文件系统属性和安全权限控制,另一个是如果你写32位的程序,系统API支持64位的文件长度而标准库的只支持最多4G不到。假如你想写个文件下载器什么的,下个“稍微”大点的文件都下不了
------解决方案--------------------
正好相反。
一般靠谱的策略是如果不确定你是不是要用某些功能,那就不要用;有强大的、封装层次较低的接口和较弱的、封装层次较高的接口,尽量使用后者。避免用得稀里糊涂的同时在可移植性问题上能降低风险;否则就是无谓增加环境限制的需求,自缚手脚。
标准库I/O不是纯粹的兼容层。它有自己的设计和功能特性(比如缓冲)。用不用得到当然也需要考虑进去。不过,按需关掉缓冲对于敢用底层API的用户来说应该没什么难度。
对于LZ的问题,一般来说当然标准库I/O就很可能靠不住了,理由倒是一样:功能不够用。性能上也比较微妙。
不过貌似LZ只是想要简单的文件数据库?如果不懂知道什么细节,用标准库I/O做个原型倒也可行,反正就算以后要改也应该比反过来加兼容层容易。
------解决方案--------------------
因为windows下的fopen最终调用CreateFile