【问题标题】:calling File.WriteAllText while computer crashes results in loss of data [duplicate]在计算机崩溃时调用 File.WriteAllText 会导致数据丢失[重复]
【发布时间】:2018-11-04 04:28:08
【问题描述】:

我有以下代码来保存数据:

File.Copy("data.txt", "data_backup.txt", true);
File.WriteAllText("data.txt", JsonConvert.SerializeObject(new
{
    bool1,
    string1,
    decimal1,
    decimal2,
    int1,
    datetime,
    object1,
    object2
}, new JsonSerializerSettings { Formatting = Formatting.Indented, Converters = new List<JsonConverter>() { new DontIntendArray() } }));

我的程序每 15 秒执行一次。 data.txt 的大小约为 9 MB。

我的电脑有时会崩溃,然后在重新启动后我发现 data.txt 中充满了 NULL 字符,而它的大小仍然保持在 9 MB 左右。 这就是为什么我添加了 data_backup.txt 行,但它没有帮助,因为它还保存了充满 NULL 的文件。

请注意,并非每台计算机都会发生这种情况,但显然只有在执行此代码时崩溃时才会发生。

我在我的 RAM 上使用 XMP 配置文件时遇到了这种情况,该配置文件不稳定并且不时导致崩溃。在 XMR 配置文件不稳定的两台不同计算机上,情况完全相同。 我在停电的时候也经历过。

我知道我不能指望崩溃的计算机完美地执行所有代码然后才崩溃。 但是,我可以使用任何技巧来防止在计算机崩溃之前或之前写入或保存的文件内容丢失吗? 定期将这些变量保存到文件中的全部目的是为了防止在计算机崩溃的情况下丢失数据,但显然这种方法并不总是有效。

【问题讨论】:

  • 你能通过代码自动检测错误/损坏的数据吗?
  • 我还没有故意让它崩溃来测试它。只有在未损坏的情况下,我才明白您在 WriteAllText 之后使用 File.Copy 的观点。谢谢。

标签: c# null crash writealltext


【解决方案1】:

您应该保存到一个新的文件名,然后在保存后移动新文件以替换原始文件。 这样一来,无论何时被打断,您始终拥有一份完整的副本。

【讨论】:

  • 我认为这种方法没有什么不同,因为 data.txt 和 data_backup.txt 都是空的,这意味着整个代码都已执行,但任何文件写入操作都会写入不正确的数据,因此这些文件是空的。这可能是由于 CPU 完成一些任务时 RAM 中的数据丢失。因此将执行将其保存到新文件名,但文件内容将仅为空值。这种损坏的遗嘱可能只会替换原来的遗嘱。还是我没有得到什么?
  • @LukAss741:不;这样做的目的是在旧文件不为空时保留旧文件
  • 那么你的意思是 'File.WriteAllText("data_new.txt"' 然后是 'File.Copy("data_new.txt", "data.txt", true);'?
  • 是的,除了移动而不是复制。
  • @LukAss741: Move 应该是一个原子操作(它更新文件表;它不移动字节)
猜你喜欢
  • 2016-04-23
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多