10

有什么区别,在什么情况下,其中一种会在某种程度上被证明是优越的?

4

4 回答 4

10

首先,该功能fopen只能用于带有文件的简单可移植操作。

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

CreateFile有很多额外的有用开关,比如和FILE_FLAG_NO_BUFFERING,它们在不同的场景中非常有用。FILE_ATTRIBUTE_TEMPORARYFILE_FLAG_SEQUENTIAL_SCAN

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

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

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

该功能还有其他用途,在对应的MSDN文章中有详细介绍。

所以我可以总结一下:只有当你有硬的可移植性要求或者你需要将 a 传递FILE*给一些外部库时,你才必须使用fopen. 在所有其他情况下,我建议您使用CreateFile. 为获得最佳效果,我还建议专门学习 Windows API,因为您可以找到许多有用的功能。

更新:与您的问题没有直接关系,但我也建议您看一下从 Windows Vista 开始支持的事务性 I/O功能。使用此功能,您可以将一堆对文件、目录或注册表的操作作为一个不能被中断的事务提交。这是一个非常强大和有趣的工具。如果您现在还没有准备好使用事务性 I/O 功能,您可以先从CreateFile应用程序开始并将其移植到事务性 I/O。

于 2010-06-14T16:27:35.640 回答
5

这实际上取决于您正在编写的程序类型。如果它应该是便携式的,fopen将使您的生活更轻松。fopen将称为CreateFile“幕后”。

一些更高级的选项(缓存控制、文件访问控制等)仅在您使用 Win32 API 时可用(它们依赖于 Win32 文件句柄,而不是FILEstdio 中的指针),所以如果您正在编写纯 Win32应用程序,您可能需要使用 CreateFile。

于 2010-06-14T15:00:55.380 回答
1

CreateFile 让您

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

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

于 2010-06-14T15:08:48.957 回答
0

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

当然,您应该关心共享模式,因此 fopen() 和 STL 是不够的。

于 2010-06-14T21:24:48.530 回答