在Windows中,我应该使用CreateFile还是fopen,除了可移植性?

时间:2010-06-14 14:58:21

标签: windows winapi fopen createfile

有什么区别,在什么情况下,一方或另一方在某种程度上证明是优越的?

4 个答案:

答案 0 :(得分:9)

首先,函数fopen只能用于带文件的简单便携式操作。

另一方面的

CreateFile不仅可用于文件操作,还可用于目录(使用相应选项),管道和各种Windows设备。

CreateFile还有许多其他有用的开关,例如FILE_FLAG_NO_BUFFERINGFILE_ATTRIBUTE_TEMPORARYFILE_FLAG_SEQUENTIAL_SCAN,这些开关在不同情况下非常有用。

您可以使用CreateFile,其文件名长度为MAX_PATH个字符。对于某些服务器应用程序或必须能够打开任何文件(例如病毒扫描程序或备份应用程序)的应用程序,这一点非常重要。这是通过使用命名空间语义来实现的,尽管这种模式有其自身的关注点,例如能够实际创建名为".."L"\xfeff\x20\xd9ab"的文件(祝你好运以后再尝试删除它们)。

您可以在不同的安全方案中使用CreateFile。我的意思是不仅使用安全属性。如果当前进程具有SE_BACKUP_NAME或SE_RESTORE_NAME权限(如管理员通常拥有的权限)并启用此权限,则可以使用CreateFile打开任何文件也是您无法通过安全描述符访问的文件

如果您只想阅读文件内容,可以使用CreateFileCreateFileMappingMapViewOfFile来创建文件映射。然后,您可以像处理内存块一样使用文件,这可能会提高应用程序的速度。

该功能还有其他用途,详见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让你

  • 打开异步I / O文件
  • 传递优化提示,如FILE_FLAG_SEQUENTIAL_SCAN
  • 设置安全性并继承设置,不会出现线程问题

它们不返回相同的句柄类型,使用fopen / FILE对象可以调用其他运行时函数(如fput)(以及将其转换为“本机”文件句柄)

答案 3 :(得分:0)

尽可能选择支持RAII的面向对象的包装器,如fstream或boost文件IO对象。

当然,你应该关心共享模式,所以fopen()和STL是不够的。