当前位置: 首页 > 面试题库 >

如何安全地写入文件?

古凌
2023-03-14
问题内容

假设您有一个用于处理某种XML文件或配置文件的库。该库将整个文件读入内存,并提供用于编辑内容的方法。处理完内容后,可以调用write将内容保存回文件。问题是如何以安全的方式执行此操作。

覆盖现有文件(开始写入原始文件)显然是不安全的。如果该write方法在完成之前失败,则最终将写入一半的文件,并且您丢失了数据。

更好的选择是在某个位置写入 临时 文件,write方法完成后, 临时文件 复制 到原始文件。

现在,如果复制由于某种原因失败了,您仍然可以正确地将数据保存在临时文件中。如果复制成功,则可以删除临时文件。

我猜在POSIX系统上,您可以使用rename系统调用,这是一个原子操作。但是,如何在Windows系统上做到最好呢?特别是,如何使用
Python 最好地解决这个问题?

另外,还有另一种安全写入文件的方案吗?


问题答案:

如果您看到Python的文档,它显然提到os.rename()是一个原子操作。因此,在您的情况下,将数据写入临时文件,然后将其重命名为原始文件将非常安全。

另一种方法可以像这样工作:

  • 让原始文件为abc.xml
  • 创建abc.xml.tmp并向其中写入新数据
  • 将abc.xml重命名为abc.xml.bak
  • 将abc.xml.tmp重命名为abc.xml
  • 在正确放置新的abc.xml之后,删除abc.xml.bak

如您所见,您拥有abc.xml.bak,如果与tmp文件有关的任何问题以及将其复制回去时都可用于还原。



 类似资料:
  • 问题内容: 我有一个长时间运行的过程,该过程将很多东西写入文件中。结果应该是全部或什么都没有,因此我正在写入一个临时文件,并在最后将其重命名为真实名称。目前,我的代码是这样的: 我对此不满意,原因有几个: 如果发生异常,它将无法正确清理 它忽略了并发问题 它是不可重用的(我在程序的不同位置需要它) 有什么建议可以改善我的代码吗?有图书馆可以帮助我吗? 问题答案: 您可以使用Python的模块为您提

  • 虽然可以在Java 8中序列化lambda,但强烈建议不要这样做;甚至不鼓励序列化内部类。给出的原因是lambdas可能无法在另一个JRE上正确反序列化。然而,这是否意味着有一种方法可以安全地序列化lambda? 例如,假设我定义一个类如下: 如果像这样声明了类的实例,则不应序列化它: 但如果我创建一个这样的类实例,会怎么样: 现在序列化是安全的吗?我的直觉告诉我,是的,它应该是安全的,因为没有理

  • 问题内容: 我目前正在编写一个小脚本,供在使用Python的一台服务器上使用。该服务器仅安装了Python 2.4.4。 直到2.5版本问世,我才开始使用Python,所以我习惯了这种形式: 但是,在2.5之前没有声明,而且我很难找到有关手动清理文件对象的正确方法的示例。 使用旧版本的python时安全处置文件对象的最佳实践是什么? 问题答案: 参见docs.python.org: 处理完文件后,

  • 问题内容: 我现在在代码中使用ReentrantReadWriteLock来同步树状结构的访问。这种结构很大,可以被许多线程同时读取,偶尔对其一部分进行修改,因此似乎很适合读写习惯。我了解到,对于这一特定类,不能将读取锁提升为写入锁,因此根据Javadocs,必须在获得写入锁之前释放读取锁。之前,我已经在非可重入上下文中成功使用了这种模式。 但是,我发现我无法可靠地获取写锁而不会永远阻塞。由于读锁

  • 人生太短,不能写没人会读的废话,如果你写了废话,没人会去读。所以好一点的文档是最好的。经理不会去理解这些东西,因为不好的文档会给他们错误的安全感以至于他们不敢依赖他们的程序员。如果一些人绝对坚持你真的在写没用的文档,就告诉他们“是的”,然后安静的找一份更好的工作。 没有其他事情比精确估计 把好的文档转为放松文档要求的估计 更为有效率。真相是冷酷而艰难的:文档,就像测试,会花比开发代码多几倍的时间。