2010-06-04 95 views
11

在Haskell中安全創建臨時目錄的正確方法是什麼? System.IO提供了創建臨時文件的方法,但我找不到任何對目錄執行相同操作的任何內容,既不存在也不在System.Directory,System.Posix.DirectorySystem.Posix.Temp中。有沒有我忽略的功能,還是我需要自己寫一個功能? (?如果是的話,有沒有危險,以避免,如存在與創建臨時文件)在Haskell中創建臨時目錄

回答

6

對於Unix系統具體工作中,Unixutils包中包含這樣的功能:

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

如果你需要它在Windows和Unix系統上工作,你需要使用臨時包。它具有相同的功能以稍微不同的類型簽名:

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

+1

這將返回將創建新臨時文件的目錄(即通常爲「/ tmp」)。它實際上並不創建臨時目錄。 – 2010-06-04 23:30:25

+0

@Travis ACK! withTemporaryDirectory就是我一直在尋找的東西。 – 2010-06-05 00:05:54

+0

這很適合我使用的用法,因爲它在我完成後自動清理目錄。 – 2010-06-05 00:39:49

2

你可以看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 

那驚天動地定義此功能的事實表明,有沒有做到這一點的標準方式。

+3

現在這個功能已被分解到['temporary'](http://hackage.haskell.org/package/temporary)包中。 – bgamari 2014-10-20 23:58:19

0

至於建議的@Nikita沃爾科夫,我張貼@Thomas M. DuBuisson的評論作爲一個單獨的答案:

使用temporary包。它爲使用臨時文件和目錄提供了一個便捷的獨立於平臺的API。臨時文件和目錄在使用後會自動刪除。