【问题标题】:Low Level File Operations Handling on Linux and Windows c++ [closed]Linux和Windows c ++上的低级文件操作处理[关闭]
【发布时间】:2014-02-24 15:19:26
【问题描述】:

尽管有类似的问题,如herehere,但我有一个关于不同案例的问题。

通过使用 C/C++,我想将一些字节写入文件。最初文件有数据。简单地说,我更新文件的内容:我打开、写入和关闭。但是,如果它在写入过程中失败并且我们无法处理失败(例如,应用程序崩溃、中断、断电等),那么在下面列表之间的输出文件中可以保证什么?哪些情况可以发生,哪些不能?

  1. 文件可能为空(已删除现有值且无法写入新值)
  2. 文件保持锁定状态
  3. 文件可能同时包含旧值和新值(即前 5 行是新值,后 5 行是旧值)
  4. 文件可能包含旧值。
  5. 还有什么我没想到的吗?

如果你能给我独立于操作系统的方法,我会很高兴

谢谢

【问题讨论】:

  • 您使用什么模式打开输出文件(写入、追加等)?
  • 我正在使用写模式。
  • 你想达到什么目的?将数据附加到文件中,以便文件保持原样或安全更新?
  • 我想确保案例 3 永远不会发生。其他情况可以被检测到并且可以很容易地处理。但是,如果文件同时包含旧值和新值,我将需要更多控制来检测它。
  • 对于每个打开/写入/关闭操作,您是否覆盖了旧文件的全部内容?如果是这样,如何在文件的开头和结尾用一些匹配的元数据包装您的数据。每个 Open/Write/Close 操作都是唯一的,并且可以在以后验证以匹配。如果元数据不匹配,您就知道您遇到了案例 3​​。

标签: c++ linux windows file


【解决方案1】:

将新数据写入同名但扩展名为“tmp”的文件。刷新并关闭 tmp 文件。删除原始文件。将 tmp 文件重命名为原始文件名。

在启动时,扫描文件夹中的所有文件。删除名称部分与现有“源”文件匹配的所有 tmp 文件(即系统在 tmp 文件写入期间被中断)。重命名任何名称部分与现有源文件不匹配的tmp文件,(tmp文件已写入,原始文件已删除但重命名前系统已中断)。

这个系统依赖于删除原始文件的原子性。如果成功,您将获得新数据,如果失败,您将获得旧数据。你永远不应该得到每一个的碎片。

【讨论】:

  • 谢谢。好办法。我也从您的回复中了解到,可能会遇到 #3 的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
相关资源
最近更新 更多