openTempFile的原子性
我有以下功能:openTempFile的原子性,file,haskell,io,temporary-files,File,Haskell,Io,Temporary Files,我有以下功能: safeWrite :: Text -> IO () safeWrite c = bracket (openTempFile "/tmp" "list.tmp") (\(path, h) -> hClose h >> copyFile path dataFile >> removeFile path) (\(_, h) -> TI.hPutStr h c) 我的印象是这样做是安全的,如果在任何时候
safeWrite :: Text -> IO ()
safeWrite c = bracket (openTempFile "/tmp" "list.tmp")
(\(path, h) -> hClose h
>> copyFile path dataFile
>> removeFile path)
(\(_, h) -> TI.hPutStr h c)
我的印象是这样做是安全的,如果在任何时候出现错误,就不会进行复制,并且原始文件仍然可以使用。然而就在昨天,我得到了一个空文件,我不知道去哪里看它。这个项目已经运行了一个多月了,没有出现任何问题,这说明我没有想到会有什么困难
该方法是否保证原子性,意味着错误在其他地方,或者如果不是,为什么不是?我应该如何保证原子性?您对
mkTemp
的定义对于Haskell异常来说是原子性的。如果出现异常,它将打印有关故障的消息(将文件留在那里)
- 对于Unix文件系统来说,它不是原子的——其他程序可能会覆盖相同的文件
- 如果出现故障,它不会清理
mkTemp
函数,就可以进行更多清理工作:
safeWrite :: Text -> IO ()
safeWrite c = bracket (openTempFile "/tmp" "list.tmp")
(\(path, h) -> hClose h
>> copyFile path dataFile
>> removeFile path)
(\(_, h) -> TI.hPutStr h c)
:openTempFile