【问题标题】:Windows CreateFile Possible Error CodesWindows CreateFile 可能的错误代码
【发布时间】:2013-10-08 13:38:07
【问题描述】:

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

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

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

这个怎么样?

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

有没有人提到 Windows 文件函数可能生成的可能错误代码,特别是(目前)CreateFile()?

【问题讨论】:

  • 没有这样的列表,而且很可能永远不会有。为什么你需要知道这个?
  • The Microsoft Developer Network 可能有东西。
  • 顺便说一句,你确实知道C++已经做到了吗?也就是发abstract, platform independent, file handling functionality。
  • 为什么要添加C作为标签?您想要 C 还是 C++ 解决方案?
  • 伙计,我以为这是一个简单的问题……你们太残忍了。编码警察...... @SigTerm 我花了很多精力研究这个。我不明白你的意思是它可以从 C++ 中使用,或者说它不是 C,它肯定是。

标签: c++ c windows file-io


【解决方案1】:

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

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

【讨论】:

  • 谢谢汉斯,感谢您对我的问题的直接回答。我担心会出现这种情况,但我希望不抱希望。我给你的答案是文明和礼貌(而不是假设我是一个没有检查相关文档或像疯子一样在谷歌上搜索答案或搜索相关问题的白痴。)
  • @random_acts:“而不是假设”,你没有提到你尝试了什么,你研究了什么,你在网上找到了什么。默认情况下,人们通常会假设最坏的情况。
  • 从您的帖子看来,可安装的文件系统似乎意味着无法定义错误代码。但我的 API 开发人员说,确实是 微软不对错误代码施加限制,不多也不少。
【解决方案2】:

避免 C 运行时

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

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

关于你的问题

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

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

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

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

【讨论】:

  • 我检查了 WinAPI 文档,没有骰子。我什至筛选了前 500 个错误代码,看看哪些可能适用。我怀疑筛选下一个 14500 会更有帮助。不过谢谢!
  • CreateFile 不仅仅用于文件,这是非常正确的。我想我希望某种文档至少可以减少从 16000 到 500 的可能性,并且我可以挑选出与文件相关的文档。
  • @random_acts:不。没有这样的事。只需使用 FormatMessage。我的意思是,即使您处理了现在存在的所有代码,在未来版本的 Windows 中,他们也可以添加新代码。那会破坏你的程序。 Hans 对可安装的文件系统有一个很好的观点。因此,无论您如何看待它,试图找到要使用的代码子集都可能导致某种灾难。只是不要这样做。
猜你喜欢
  • 2011-09-04
  • 1970-01-01
  • 2015-11-10
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 2011-11-17
  • 2014-12-29
相关资源
最近更新 更多