4

我正在尝试将 Windows、Linux 和 Mac 文件 IO 调用抽象为宏(以避免 C 运行时,所以没有fopen,fclose等...)。我实际上已经做了很多工作,但我遇到了一个绊脚石。

我试图将这些平台中的每一个可能引发的所有可能的错误归结为常见错误的子集:未找到、存在、无效访问等。

Linux 显然是很好的文档,Mac 甚至有最常见的,但 Windows 没有指定其原生文件 I/O 函数会引发哪些错误。我们显然需要使用GetLastError(),但我找不到可能值的参考。

这个怎么样?

我正在编写一个 Windows 应用程序并使用CreatFile()API。我想尽可能优雅地处理任何错误,并且可能从所述错误中恢复,而不是告诉用户“废话!不能那样做”。但是 MSDN 文档没有列出可能生成的错误代码。

有没有人提到 Windows File 函数可能生成的可能错误代码,特别是(现在)CreateFile()

4

2 回答 2

8

Windows 支持可安装的文件系统。Microsoft 无法预测第 3 方文件系统驱动程序将生成什么样的错误,因此不会尝试承诺可能的错误代码的严格子集。

所以是的,你确实必须使用 GetLastError()。FormatMessage() 函数可用于为错误代码生成可读字符串。通常,用户会收到一条不错的错误消息,帮助他诊断根本原因。说智利的地震切断了海底通信电缆还不够具体,但它肯定会帮助他开始研究网络问题。您也可以使用 CRT 包装器,但不可避免地会失去特异性。这可能是您必须处理的服务呼叫,而不是用户的 IT 人员。

于 2013-10-08T14:07:45.537 回答
3

避免 C 运行时

你在重新发明轮子。创建 C 运行时是为了让人们可以编写与平台无关的程序,这些程序(理论上)可以在任何地方编译,只要您不使用特定于平台的东西。现在,你正在做同样的事情。

我建议停止这样做,要么使用标准的 C 文件函数,要么使用支持多个平台的跨平台框架。您可以使用 Boost 或 Qt 4。

关于你的问题

有没有人参考 Windows File 函数可能生成的可能错误代码,

MSDN 上提供了 WinAPI 文档,您应该阅读它。
CreateFile
GetLastError
SystemErrorCodes

有没有人参考 Windows 文件功能可能生成的可能错误代码

因为 CreateFile 不仅处理“文件”(它还处理目录、管道、物理设备等),你应该假设它可以生成任何存在的操作系统代码。根据msdn,总共有16000个代码。故事的寓意:如果您想生成人类可读的消息,请使用FormatMessage。如果文档没有列出可能的错误代码(对于 CreateFile),则自动意味着 CreateFile 可以生成任何存在的错误代码。

于 2013-10-08T13:57:30.030 回答