我有以下功能:
safeWrite :: Text -> IO ()
safeWrite c = bracket (openTempFile "/tmp" "list.tmp")
(\(path, h) -> hClose h
>> copyFile path dataFile
>> removeFile path)
(\(_, h) -> TI.hPutStr h c)我的印象是这将是安全的,如果在任何时刻出现错误,都不会发生复制,并且原始文件仍然可以使用。然而,就在昨天,我得到了一个空文件,我不知道去哪里看它。该程序已经运行了一个多月,没有任何问题,这说明了一些我没有想到的死角情况。
该方法是否保证原子性,这意味着错误在其他地方,如果不是,为什么不呢?我应该做什么来保证原子性?
发布于 2011-05-11 15:17:49
相对于mkTemp异常,您对Haskell的定义是原子的。如果有异常,它将打印一条关于失败的消息(将文件留在那里)。
您可以做更多的清理工作,如果有异常,可以选择删除该文件,或者只需使用提供的(原子) mkTemp函数:
openTempFile:http://hackage.haskell.org/packages/archive/base/4.3.1.0/doc/html/System-IO.html#g:22或者使用posix层:
https://stackoverflow.com/questions/5960518
复制相似问题