代码之家  ›  专栏  ›  技术社区  ›  Paul Kuliniewicz

在haskell中创建临时目录

  •  11
  • Paul Kuliniewicz  · 技术社区  · 16 年前

    在haskell中安全创建临时目录的正确方法是什么? System.IO 提供创建临时 文件夹 ,但是我找不到对目录有相同作用的内容,无论是在那里还是在 System.Directory , System.Posix.Directory 也不 System.Posix.Temp . 有没有一个我忽略的功能,或者我需要自己写一个?(如果是这样,是否有任何危险需要避免,就像创建临时文件一样?)

    3 回复  |  直到 16 年前
        1
  •  6
  •   cimmanon    10 年前

    为了专门使用UNIX系统,unixutils包包含这样一个函数:

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

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

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

        2
  •  2
  •   Travis Brown    16 年前

    你可以看看 Distribution.Compat.TempFile 以阴谋集团源头模块为例。它定义 createTempDirectory 如下(其中 c_getpid 和 mkPrivateDir 是平台特定的):

    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
    

    事实上,阴谋集团定义了这个功能,这表明没有一个标准的方法来做它。

        3
  •  0
  •   Yitz    11 年前

    正如@nikita volkov所建议的,我将@thomas M.dubuisson的评论作为一个单独的答案发布:

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

    推荐文章