我正在将Windows,Linux和Mac文件IO调用抽象为宏(以避免C运行时,因此没有 fopen
,fclose
等...)。我实际上有相当多的工作,但我遇到了绊脚石。
我正在尝试将每个平台可能引发的所有可能错误归结为常见的错误:未找到,存在,无效访问等。
Linux显然是很好的文档,Mac甚至有最常见的文档,但Windows没有指定为其本机文件I / O函数抛出哪些错误。我们显然需要使用 GetLastError()
,但我找不到可能值的参考。
我正在编写Windows应用程序并使用CreatFile()
API。我想尽可能优雅地处理任何错误,并且可能从错误中恢复,而不是告诉用户“废话!不能那样做”。但是MSDN文档没有列出可能生成的错误代码。
有没有人引用Windows文件函数可能生成的错误代码,特别是(现在)CreateFile()
?
答案 0 :(得分:6)
Windows支持可安装的文件系统。 Microsoft无法预测第三方文件系统驱动程序将生成哪种错误,因此不会尝试承诺严格的可能错误代码子集。
所以是的,你真的必须使用GetLastError()。 FormatMessage()函数可用于为错误代码生成可读字符串。通常,用户将获得一个体面的错误消息,帮助他诊断根本原因。据说智利的地震切断了海底通信电缆还不够具体,但这肯定会帮助他开始研究网络问题。您也可以使用CRT包装,但不可避免地会失去特异性。这可能是您必须处理的服务调用,而不是用户的IT人员。
答案 1 :(得分:3)
避免C运行时
你正在重新发明轮子。 C运行时已经创建,因此人们可以编写独立于平台的程序(理论上)可以在任何地方编译,只要您没有使用特定于平台的东西。 现在,你正在做同样的事情。
我建议停止这样做,并使用标准C文件功能,或支持多个平台的跨平台框架。你可以使用Boost或Qt 4。
关于你的问题
MSDN上提供了WinAPI文档,您应该阅读它 CreateFile是否有人引用了Windows文件功能可能生成的错误代码,
是否有人引用了Windows文件功能可能生成的错误代码
因为CreateFile不仅处理“文件”(它也适用于目录,管道,物理设备等),您应该假设它可以生成任何存在的操作系统代码。根据msdn,总共有16000个代码。故事的道德:如果您想生成人类可读的消息,请使用FormatMessage。如果文档没有列出可能的错误代码(对于CreateFile),它自动意味着CreateFile可以生成任何存在的错误代码。