【问题标题】:Can the WriteFile() function just stop working? [closed]WriteFile() 函数可以停止工作吗? [关闭]
【发布时间】:2011-05-04 22:17:01
【问题描述】:

我有一个用 C++ 编写的 Windows 程序。它使用WriteFile() WinAPI 函数定期将信息写入文本文件。

程序在启动时打开文件,并保持文件打开直到退出。程序使用以下代码打开文件:

CreateFileW(path, GENERIC_WRITE, FILE_SHARE_READ, &sa,
    OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

最近出现以下问题:运行大约 10 天后,程序停止向文件写入信息。但是当程序重新启动时,它会继续写入文件。

假设程序没有错误并且继续调用WriteFile写入数据:WriteFile函数可以在正常工作一段时间后开始失败吗?什么会导致这种情况? (除了磁盘空间问题。文件比较小,磁盘空间足够)。

(遗憾的是程序没有检查WriteFile的返回值)。

【问题讨论】:

  • 我不知道为什么它失败了,但是你不应该让文件保持打开那么长时间。假设它是一个日志文件,通常的做法是在达到时间和/或音量阈值后关闭并重新打开它(通常,音量阈值是“一个日志条目”)。您还应该回收日志,即在午夜,关闭并使用日期戳重命名当前输出文件,然后在准备写入下一个条目时启动新日志。
  • 任何数量的事情都可能导致写入失败,如果失败,那么后续写入很可能会失败。一些可能性:内存不足,挂起的写入过多,间歇性硬件故障。如果你不检查WriteFile的返回值,那么你能做的就是推测。
  • (无关):您可以使用FILE_APPEND_DATA 代替GENERIC_WRITE
  • 查看 WriteFile 的 MSDN 条目 (msdn.microsoft.com/en-us/library/aa365747(v=vs.85).aspx) 函数失败的原因有很多。如果您无权访问应用程序的源代码以向函数添加错误检查,请考虑使用 SysInternals 的 FileMon 等工具来监视文件写入。我不知道该工具在很长一段时间内的性能如何,但也许你会发现它有帮助。
  • @Marcelo Cantos ,长时间保持文件打开有什么问题?它会导致 WriteFile 失败吗?我保持打开状态以确保没有其他应用程序会打开它并禁止我的应用程序对其进行写访问。

标签: c windows winapi visual-c++


【解决方案1】:

WriteFile() API 函数有错误是非常难以置信的。下一步必须检查错误代码并在函数失败时调用GetLastError()

【讨论】:

    【解决方案2】:

    可能导致这种情况的一个原因是:

    • 当 Windows 停止硬盘驱动器以节省能源时,文件已关闭或
    • 当它进入待机模式时

    【讨论】:

      【解决方案3】:

      在我们的例子中,WriteFile 函数失败了,因为我们在计时器中调用了该函数。线程中有另一个函数在并行线程中调用 ReadFile(并访问同一个文件)。由于 WriteFile 在该实例中无法访问该文件,因此它曾经失败过!

      【讨论】:

      • 您应该简单地将其添加为评论。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多