11

在 Haskell 中安全地创建临时目录的正确方法是什么? System.IO提供了创建临时文件的方法,但我找不到任何对目录有相同作用的东西,无论是 there 还是 in System.DirectorySystem.Posix.DirectorySystem.Posix.Temp. 有没有我忽略的功能,还是我需要自己写一个?(如果是这样,是否有任何危险需要避免,例如创建临时文件?)

4

3 回答 3

7

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

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

如果你需要它同时在 Windows 和 Unix 系统上工作,你会想要使用临时包来代替。它具有相同的功能,但类型签名略有不同:

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

于 2010-06-04T23:27:12.060 回答
2

您可以查看Distribution.Compat.TempFileCabal 源的模块作为示例。它定义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 定义此函数的事实表明没有标准的方法来执行此操作。

于 2010-06-04T23:37:47.107 回答
1

正如@Nikita Volkov 所建议的,我将@Thomas M. DuBuisson 的评论作为单独的答案发布:

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

于 2015-05-28T16:07:16.797 回答