有哪些差异,在什么情况下其中一个或另一个在某种程度上会被证明更优越?

有帮助吗?

解决方案

首先是功能 fopen 只能用于文件的简单便携式操作。

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

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

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

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

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

该函数还有其他用途,详细描述见 相应的 MSDN 文章。

所以我可以总结一下:仅当您有严格的可移植性要求或需要通过 FILE* 到一些外部库,那么你必须使用 fopen. 。在所有其他情况下,我建议您使用 CreateFile。为了获得最佳结果,我还建议专门学习 Windows API,因为您可以找到很多有用的功能。

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

其他提示

这真的取决于你正在写什么类型的节目。如果它应该是便携式的,fopen会让你的生活更轻松。 fopen将调用CreateFile “幕后”。

一些更高级的选项(高速缓存控制,文件访问控制等)仅适用,如果你正在使用Win32 API(它们依赖于Win32文件句柄,而不是在标准输入输出的FILE指针),所以如果你是写一个纯粹的Win32应用程序,则可能要使用的CreateFile。

CreateFile 让您

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

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

只要有可能,更喜欢的面向对象的包装器的支持RAII,像fstream的或升压文件IO对象。

您应,当然,有关共享模式,所以fopen()函数和STL护理是不够的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top