【发布时间】: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++