首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >openTempFile的原子性

openTempFile的原子性
EN

Stack Overflow用户
提问于 2011-05-11 15:09:03
回答 1查看 113关注 0票数 0

我有以下功能:

代码语言:javascript
复制
safeWrite :: Text -> IO ()
safeWrite c = bracket (openTempFile "/tmp" "list.tmp")
    (\(path, h) -> hClose h
      >> copyFile path dataFile
      >> removeFile path)
    (\(_, h) -> TI.hPutStr h c)

我的印象是这将是安全的,如果在任何时刻出现错误,都不会发生复制,并且原始文件仍然可以使用。然而,就在昨天,我得到了一个空文件,我不知道去哪里看它。该程序已经运行了一个多月,没有任何问题,这说明了一些我没有想到的死角情况。

该方法是否保证原子性,这意味着错误在其他地方,如果不是,为什么不呢?我应该做什么来保证原子性?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-11 15:17:49

相对于mkTemp异常,您对Haskell的定义是原子的。如果有异常,它将打印一条关于失败的消息(将文件留在那里)。

  • 对于Unix文件系统,它不是原子的--其他程序可能会覆盖相同的文件,如果出现故障,它不会清除该文件。

您可以做更多的清理工作,如果有异常,可以选择删除该文件,或者只需使用提供的(原子) mkTemp函数:

  • openTempFilehttp://hackage.haskell.org/packages/archive/base/4.3.1.0/doc/html/System-IO.html#g:22

或者使用posix层:

  • http://hackage.haskell.org/packages/archive/unix/latest/doc/html/System-Posix-Temp.html#Temp
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5960518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档