我有一个应用程序写入更新磁盘文件,但我想尽可能确保以前版本的文件不被破坏。Clojure中的原子文件替换
最直接的方式来更新文件,当然,是简单地写:
(spit "myfile.txt" mystring)
但是,如果PC(或Java程序)以书面的过程中死机,这有一个小破坏文件的机会。
更好的解决方案可能是写:
(do (spit "tempfile" mystring)
(.rename (file "tempfile") "myfile.txt")
(delete-file "tempfile"))
此使用java文件重命名功能,这是我聚集在大多数情况下,单个存储设备上被执行时通常是原子的。
对Clojure文件IO有一些深入的了解的任何Clojurians对这是最好的方法还是有任何建议,或者在更新磁盘文件时有更好的方法来最小化文件损坏的风险?
谢谢!
您是否在寻求一种更习惯的方式来执行相同的tempfile-rename-delete路径,或者更稳健的方法来维护文件结构的一致性? – Alex 2013-03-04 19:23:23
当它完全正确的时候,我正在寻找保持文件结构一致性的最佳方式(我为一个项目构建一个小型的基于文件的数据库,并且希望确保我能够正确地记录文件。) – drcode 2013-03-04 19:55:24
为什么删除tempfile?假设'。重命名“相当于'mv'源文件不应该存在。也不应该是'renameTo'?我在'java.io.File'中看不到'rename()'。 – 2013-03-05 03:00:38