我有一个应用程序正在修改 5 个相同的 xml 文件,每个文件位于不同的网络共享上。我知道这是不必要的多余,但“必须如此”。

每次运行此应用程序时,都会添加/删除/修改一个元素(不多也不少)。

最初,应用程序打开每个 xml 文件,将元素添加/删除/修改到适当的节点并保存文件,或者如果不能(无法访问网络共享、超时等...)则抛出错误

我如何使这个原子化?

我最初的假设是:

foreach (var path in NetworkPaths)
    if (!File.Exists(path)
        isAtomic = false;

if (isAtomic)
{
    //Do things
}

但我认为这只是到目前为止。还有其他方法可以做到这一点,或者可以为我指明方向吗?

有帮助吗?

解决方案

不幸的是,它是真正的“原子”是不是真的有可能。我最好的建议是要给你自己的交易,这种形式,所以你至少可以撤消更改。

我要像做检查对于每个文件 - 如果不存在,抛出

备份的每个文件,保存到撤消或保存拷贝到内存中,如果他们不是巨大所需的状态。如果你不能,扔。

进行修改,然后保存文件。如果你得到一个故障在这里,试图从各个备份还原。你需要在这里做一些错误处理,所以你不要扔,直到所有的备份进行了修复。恢复后,把你的异常。

至少这样,你会更容易不做出改变,以一个单一的文件。我们希望,如果你可以修改一个文件,你就可以将其从备份中恢复/撤消你的修改。

其他提示

我建议采用以下解决方案。

  • 尝试使用写锁打开所有文件。
    • 如果一个或多个失败,则中止。
    • 修改并刷新所有文件。
      • 如果一个或多个失败,则将已修改的回滚并再次刷新它们。
  • 关闭所有文件。

如果回滚失败...出色地 ...再试一次,再试一次,再试一次......并在不一致的状态下放弃。

如果您可以控制写入此文件的所有进程,则可以使用锁定文件实现简单的锁定机制。您甚至可以执行预写日志记录并将计划的更改记录在锁定文件中。如果您的进程崩溃,下一个尝试修改文件的进程将检测到不完整的操作,并可以在进行一次修改之前继续操作。

我将介绍文件的版本控制。您可以通过在文件名后添加后缀轻松完成此操作。例如计数器变量。读者的流程如下:

  • 准备文件的下一个版本
  • 将其写入具有不同名称的临时文件。
  • 获取最高版本号
  • 将此版本加一
  • 将临时文件重命名为新文件
  • 删除旧文件(您可以保留例如其中2个)

作为您所做的读者 - 找到最高版本的文件 - 阅读

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top