文件损坏检测和错误处理

时间:2009-07-17 13:49:07

标签: c++ file-io

我是一名新手C ++开发人员,我正在研究一个需要经常写出日志文件的应用程序,并且我们注意到在运行应用程序时日志文件已经损坏了几次。主要方案似乎是程序关闭或崩溃时,但我担心这不是唯一可能出错的时间,因为应用程序是从一个相当“快速和肮脏”的项目中诞生的

保存最绝对最新的数据并不重要,所以有人提到的一个想法是交替写入两个日志文件,然后如果程序崩溃,至少有一个仍然具有正确的完整性。但这并不适合我,因为我还没有看到任何其他应用程序使用这种方法。

是否有任何“最佳实践”或标准“模式”或框架来处理此问题?

目前我正在考虑做这样的事情 -

  1. 将数据写入临时文件
  2. 检查数据是否使用哈希
  3. 正确编写
  4. 重命名原始文件,并将临时文件放置到位。
  5. 删除原始
  6. 然后,如果有任何失败,我可以通过删除临时回滚,原来不受影响。

4 个答案:

答案 0 :(得分:3)

您必须找到文件损坏的原因。如果应用程序意外崩溃,则无法破坏文件。唯一可能发生的是文件被截断(即缺少最后的日志消息)。但是应用程序无法在文件中跳转并在其他地方修改内容(除非您在日志记录代码中调用seek,这会让我感到惊讶)。

我的猜测是该应用程序是多线程的,并且正在从多个线程调用日志代码,这些线程很容易导致数据在数据被写入日志之前被损坏。

答案 1 :(得分:2)

您可能忘记每隔一段时间调用fsync(),或者数据来自不同的线程而它们之间没有正确的同步。没有更多信息(平台,你看到的腐败形式)很难说。

解决方法是使用日志文件翻转,即。经常开始一个新文件。

答案 2 :(得分:2)

我真的认为当你开始为日志文件添加复杂性时,你(以及其他人)正在浪费你的时间。日志的重点在于它应该易于使用和实现,并且应该在大多数情况下都能正常工作。为此,只需将日志写入一个无缓冲的流(l;在C ++程序中使用ike cerr),然后根据我的经验,偶尔使用snafus。

OTOH,如果您确实需要对应用程序所做的一切进行审计跟踪,出于法律原因,那么您应该使用某种形式的事务存储,例如SQL数据库。

答案 3 :(得分:1)

不确定您的应用是否是多线程的 - 如果是这样,请考虑使用Active Object Pattern (PDF)将队列放在日志前面,并在单个线程中进行所有写入。该线程可以在后台提交日志。所有日志写入都是异步的,按顺序,但不一定立即写入。

活动对象也可以批量写入。