在Haskell中创建一个临时目录

时间:2010-06-04 22:31:34

标签: haskell temporary-directory

在Haskell中安全地创建临时目录的正确方法是什么? System.IO提供了创建临时文件的方法,但我找不到任何对目录执行相同操作的内容,无论是在System.Directory,还是在System.Posix.DirectorySystem.Posix.Temp, {{1}}。有一个我忽略的功能,还是我需要自己写一个? (如果是这样,是否有任何可以避免的危险,就像创建临时文件一样?)

3 个答案:

答案 0 :(得分:7)

为了专门使用Unix系统,Unixutils包中包含这样一个函数:

withTemporaryDirectory :: FilePath -> (FilePath -> IO a) -> IO a

如果您需要它在Windows和Unix系统上工作,您将需要使用临时包。它具有相同的功能,具有略微不同的类型签名:

withTemporaryDirectory :: FilePath -> String -> (FilePath -> IO a) -> IO a

答案 1 :(得分: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定义此功能的事实表明,没有一种标准的方法可以做到这一点。

答案 2 :(得分:0)

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

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