覆盖保存文件的足够安全的方法?

2024-06-24

Using cstdio,覆盖文件最安全的方法是什么?在这种情况下,“安全”意味着文件不会变得不完整或损坏;该文件将被完全覆盖,或者如果出现问题,它将是旧文件。

我想最好的方法是创建一个临时中间文件,然后在中间完成后覆盖旧文件。如果这确实是最好的方法,那么似乎还有其他一些问题可能出现,尽管这种情况很少见。

  • 如果程序在覆盖时退出,我如何知道使用另一个文件?
  • 如果程序在创建过程中退出,我怎么知道不使用其他文件?
  • 我怎么知道原始文件或 中间处于未定义状态(因为它可能会以某种方式失败 仍然可读,但其中包含的数据有微妙的错误)?

我想这有一个好的做法,但我还没有找到。这是用于保存的游戏数据;只有一个文件,并且每次都会覆盖整个文件,无需担心部分覆盖或追加。


正如其他人所说,保留现有文件,然后写入新文件。如果它非常重要(即用户不可能恢复该信息),请确保周围还有一个“备份”文件(例如,如果您的程序保存了abc.config,留下一个abc.old.config or abc.backup[如果你想保证这个名字在任何地方都有效,.cfg and .bak可能是更好的选择])。

当您写入文件时,请在文件中放置某种结束标记,以便您可以确定文件是完整的。如果您想避免“用户编辑”文件,您可能还需要内容的校验和(sha1、md5 或类似的)。如果结束标记不存在,或者校验和错误,那么您就知道该文件是“坏的”,因此不要使用它并进行备份。

  1. 将新内容写入临时文件(例如fstream fout("abc.tmp");)
  2. 删除备份文件(如果存在)(例如remove("abc.bak");)
  3. 将现在的旧文件重命名为备份名称(例如rename("abc.cfg", "abc.bak");)
  4. 将新文件重命名为旧文件(例如rename("abc.tmp", "abc.cfg");

对于所有步骤(特别是写入实际数据),检查是否有错误。您需要决定哪里可以出现错误,哪里不能出现错误(remove例如,一个不存在的文件是可以的,但是如果rename不起作用,你可能应该停止,否则你可能会得到一些不好的结果)。

加载文件时,检查所有步骤,如果出错,返回备份文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

覆盖保存文件的足够安全的方法? 的相关文章

随机推荐

  • C# 套接字编程 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 嘿 我对 C 异步套接字编程做了噩梦 您能给我指点一本深入解释异步编程的指南 教程或书籍吗 如果可能包
  • 扩展对象字面量

    var x name japan age 20 x prototype mad function alert USA x mad 上面的代码不起作用 对象字面量无法扩展 或者x mad 这不是正确的打电话方式 你不能这样做 能够使用它来定义
  • 使用通配符 ID 选择 div

    如何使用 ID 但带有通配符来选择 div 如果 DIV 的 ID 是statusMessage 1098 我想以某种方式选择它 例如document getElementById statusMessage 这是因为在生成页面之前 我不知
  • 找不到 npx 命令

    我正在使用 webpack 我需要执行 node modules webpack bin webpack js using npx npx webpack将运行 webpack 二进制文件 node modules webpack bin
  • 编译并运行金属示例

    我已经有一段时间没有使用 XCode 了 但自从 Apple 批评 XCode 6 和新的 Metal API 以来 我不得不检查一下 他们已经发布了示例 例如Basic3D 示例的转换版本 不过 我在编译和运行它们时遇到了问题 我必须添加
  • 在 PySpark 中将结构数组扩展为列

    我有一个来自 Google Analytics 的 Spark 数据框 如下所示 id customDimensions Array
  • 单选按钮未水平排列

    我的 HTML 单选按钮是垂直排列的 而不是水平排列的 另外 每个按钮的文本并不像我希望的那样位于按钮旁边 fieldset legend Payment Method legend fieldset
  • 有没有办法使用 winappdbg 从 Windows 任务管理器中混淆/隐藏命令行?

    我正在使用 python 在 win7 x64 中调用外部程序 但我想隐藏命令行选项 import winpexpect thread winexpect winspawn cmd timeout TIMEOUT import pexpec
  • 为什么当我想安装扩展时会出现 PHP 致命错误

    php composer phar require kartik v yii2 password dev 错误消息 Call to undefined method Fxp Composer AssetPlugin Package Vers
  • 在 Woocommerce 中显示客户订单评论(客户备注)

    当我尝试显示 woocommerce 客户订单评论 不是注释 而是客户在结账过程中可以添加的评论 时 我遇到了一些问题 我将仅添加此问题的相关行 因为其他 woocommerce 数据已正确显示 因此它不应该是设置问题 到目前为止我尝试过的
  • Angular 中的动态标签生成

    我正在尝试使用包含一堆指令名称的数组动态生成表单 scope components textbox textbox radio checkbox label 我想使用 Angular 生成具有这些名称的标签 例如
  • Android:应用程序在即时运行时频繁崩溃

    在我的 Android 应用程序中 我正在启用即时运行来调试它 该应用程序经常给我带来意想不到的错误 如果我进行了干净的构建 这些错误就会得到解决 例如 有时会出现类未找到的异常 而该类实际上存在 此外 有时在尝试强制转换时会出现类强制转换
  • 调用函数并将参数从 Kotlin 传递到 Flutter

    我正在处理PlatformChannels试图与来自Kotlin to Flutter 实际上尝试按照 flutter 平台频道的文档中的说明进行操作 但方向相反 flutter 平台通道文档 https flutter dev docs
  • 无阻塞地从 STDIN 逐行读取

    基本上 我希望从 STDIN 读取行 但我不想在等待新数据时阻塞 几乎就像使用带有超时的流一样 stdin fopen php stdin r do line fgets stdin No input right now if empty
  • 使用 jQuery datepicker 创建特定日期范围

    我正在尝试使用 jQuery 日期选择器来创建开始日期日历和结束日期日历 我正在使用此处看到的 日期范围 示例 http jqueryui com demos datepicker date range http jqueryui com
  • 如何在反应组件中的所有详细信息标签中添加或删除“open”属性?

    我有一个带有 React 组件的页面 该组件使用多个详细 摘要标签 const React require react class samplePage extends React Component render const siteCo
  • WKWebview:禁用交互和点击链接

    有没有办法禁用网络视图上的交互 这样用户就不能比加载的 webview 更进一步了 编辑 禁用 UserInteractions 并不是一个解决方案 因为网站仍然必须可滚动 实施WKNavigationDelegate协议 interfac
  • JavaScriptSerializer UTC 日期时间问题

    我们的客户希望在浏览器中显示与数据库中完全相同的日期和时间值 并且我们将它们作为 UTC 存储在数据库中 起初我们在序列化和 JavaScript 方面遇到了一些问题 DateTime 值移动了两次 首先是为了匹配计算机的本地时区 然后是为
  • 是否有一个更短/更简单的 for 循环版本,可以对任何内容执行 x 次?

    通常我们会使用计数器执行类似 for 或 while 循环的操作 for int i 0 i lt 10 i list Add GetRandomItem 但有时你会混淆界限 你可以使用 while 循环来代替 但是如果你犯了一个错误 这个
  • 覆盖保存文件的足够安全的方法?

    Using cstdio 覆盖文件最安全的方法是什么 在这种情况下 安全 意味着文件不会变得不完整或损坏 该文件将被完全覆盖 或者如果出现问题 它将是旧文件 我想最好的方法是创建一个临时中间文件 然后在中间完成后覆盖旧文件 如果这确实是最好