在 Haskell 中安全地创建临时目录的正确方法是什么? System.IO
提供了创建临时文件的方法,但我找不到任何对目录有相同作用的东西,无论是 there 还是 in System.Directory
、System.Posix.Directory
或System.Posix.Temp
. 有没有我忽略的功能,还是我需要自己写一个?(如果是这样,是否有任何危险需要避免,例如创建临时文件?)
问问题
2214 次
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.TempFile
Cabal 源的模块作为示例。它定义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
Cabal 定义此函数的事实表明没有标准的方法来执行此操作。
于 2010-06-04T23:37:47.107 回答
1
正如@Nikita Volkov 所建议的,我将@Thomas M. DuBuisson 的评论作为单独的答案发布:
使用临时包。它为使用临时文件和目录提供了一个方便的独立于平台的 API。临时文件和目录在使用后会自动删除。
于 2015-05-28T16:07:16.797 回答