在Haskell中创建一个临时目录

12
什么是在Haskell中安全创建临时目录的正确方法?System.IO提供了创建临时文件的方式,但我找不到任何可以创建临时目录的方法,不管是在System.DirectorySystem.Posix.Directory还是System.Posix.Temp中都没有。我是否忽略了某个函数,还是需要自己编写一个?如果需要编写,是否有需要避免的危险,就像创建临时文件一样?
3个回答

7

1
这将返回新临时文件将被创建的目录(即通常为“/tmp”)。它实际上并不会创建一个临时目录。 - Travis Brown
@Travis ACK!withTemporaryDirectory 就是我想要的。 - Don Stewart
这很适合我想要的用法,因为它可以在我完成后自动清理目录。 - Paul Kuliniewicz
5
请注意,在Hackage上有一个名为temporary的临时包,其中包含这些函数。 (是的,这晚了一年,但这个问题很容易在谷歌搜索中出现) - Thomas M. DuBuisson
2
@ThomasM.DuBuisson 您应该将此作为答案重新发布,因为它似乎更加适当,因为它是平台无关的。 - Nikita Volkov

2

你可以查看Cabal源代码中的Distribution.Compat.TempFile模块来作为示例。它定义了createTempDirectory函数,如下所示(其中c_getpidmkPrivateDir是依赖于平台的):

createTempDirectory :: FilePath -> String -> IO FilePath
createTempDirectory dir template = do
  pid <- c_getpid
  findTempName pid
  where
    findTempName x = do
      let dirpath = dir </> template ++ show x
      r <- try $ mkPrivateDir dirpath
      case r of
        Right _ -> return dirpath
        Left  e | isAlreadyExistsError e -> findTempName (x+1)
                | otherwise              -> ioError e

Cabal定义此函数的事实表明,没有一种标准的方法来完成它。

3
现在,该功能已被分解为 temporary 包。 - bgamari
@bgamari 看起来 temporary 包被放弃了,Cabal 把这个函数拿回了。我能问一下发生了什么吗? - Abastro

1

根据@Nikita Volkov的建议,我将@Thomas M. DuBuisson的评论发布为单独的答案:

使用temporary包。它提供了一个方便的跨平台API,用于使用临时文件和目录。临时文件和目录在使用后会自动删除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接