我有一個應用程序寫入更新磁盤文件,但我想盡可能確保以前版本的文件不被破壞。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