有什么区别,在什么情况下,一方或另一方在某种程度上证明是优越的?
答案 0 :(得分:9)
首先,函数fopen
只能用于带文件的简单便携式操作。
CreateFile
不仅可用于文件操作,还可用于目录(使用相应选项),管道和各种Windows设备。
CreateFile
还有许多其他有用的开关,例如FILE_FLAG_NO_BUFFERING
,FILE_ATTRIBUTE_TEMPORARY
和FILE_FLAG_SEQUENTIAL_SCAN
,这些开关在不同情况下非常有用。
您可以使用CreateFile
,其文件名长度为MAX_PATH
个字符。对于某些服务器应用程序或必须能够打开任何文件(例如病毒扫描程序或备份应用程序)的应用程序,这一点非常重要。这是通过使用命名空间语义来实现的,尽管这种模式有其自身的关注点,例如能够实际创建名为".."
或L"\xfeff\x20\xd9ab"
的文件(祝你好运以后再尝试删除它们)。
您可以在不同的安全方案中使用CreateFile
。我的意思是不仅使用安全属性。如果当前进程具有SE_BACKUP_NAME或SE_RESTORE_NAME权限(如管理员通常拥有的权限)并启用此权限,则可以使用CreateFile
打开任何文件也是您无法通过安全描述符访问的文件
如果您只想阅读文件内容,可以使用CreateFile
,CreateFileMapping
和MapViewOfFile
来创建文件映射。然后,您可以像处理内存块一样使用文件,这可能会提高应用程序的速度。
该功能还有其他用途,详见the corresponding MSDN article.
所以我可以总结一下:只有当您有可移植性要求或者需要将FILE*
传递给某个外部库时,才必须使用fopen
。在所有其他情况下,我建议您使用CreateFile
。
为了获得最佳效果,我还建议您专门学习Windows API,因为有许多功能可以很好地用于。
更新:与您的问题没有直接关系,但我还建议您先了解从Windows Vista开始支持的transactional I/O功能。使用此功能,您可以将一堆文件,目录或注册表操作作为一个无法中断的事务提交。它是一个非常强大而有趣的工具。如果您现在还没有准备好使用事务I / O函数,则可以从CreateFile
开始,然后将应用程序移植到事务I / O.
答案 1 :(得分:5)
这实际上取决于你所编写的程序类型。如果它应该是便携式的,fopen
将使您的生活更轻松。 fopen
将在幕后调用CreateFile
“。
一些更高级的选项(缓存控制,文件访问控制等)仅在您使用Win32 API时可用(它们依赖于Win32文件句柄,而不是stdio中的FILE
指针),因此,如果您正在编写纯Win32应用程序,则可能需要使用CreateFile。
答案 2 :(得分:1)
CreateFile让你
它们不返回相同的句柄类型,使用fopen / FILE对象可以调用其他运行时函数(如fput)(以及将其转换为“本机”文件句柄)
答案 3 :(得分:0)
尽可能选择支持RAII的面向对象的包装器,如fstream或boost文件IO对象。
当然,你应该关心共享模式,所以fopen()和STL是不够的。