Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
openTempFile的原子性_File_Haskell_Io_Temporary Files - Fatal编程技术网

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
或者使用posix层: