在Haskell中安全創建臨時目錄的正確方法是什麼? System.IO
提供了創建臨時文件的方法,但我找不到任何對目錄執行相同操作的任何內容,既不存在也不在System.Directory
,System.Posix.Directory
或System.Posix.Temp
中。有沒有我忽略的功能,還是我需要自己寫一個功能? (?如果是的話,有沒有危險,以避免,如存在與創建臨時文件)在Haskell中創建臨時目錄
11
A
回答
6
對於Unix系統具體工作中,Unixutils包中包含這樣的功能:
withTemporaryDirectory :: FilePath -> (FilePath -> IO a) -> IO a
如果你需要它在Windows和Unix系統上工作,你需要使用臨時包。它具有相同的功能以稍微不同的類型簽名:
withTemporaryDirectory :: FilePath -> String -> (FilePath -> IO a) -> IO a
2
你可以看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
現在這個功能已被分解到['temporary'](http://hackage.haskell.org/package/temporary)包中。 – bgamari 2014-10-20 23:58:19
0
至於建議的@Nikita沃爾科夫,我張貼@Thomas M. DuBuisson的評論作爲一個單獨的答案:
使用temporary包。它爲使用臨時文件和目錄提供了一個便捷的獨立於平臺的API。臨時文件和目錄在使用後會自動刪除。
這將返回將創建新臨時文件的目錄(即通常爲「/ tmp」)。它實際上並不創建臨時目錄。 – 2010-06-04 23:30:25
@Travis ACK! withTemporaryDirectory就是我一直在尋找的東西。 – 2010-06-05 00:05:54
這很適合我使用的用法,因爲它在我完成後自動清理目錄。 – 2010-06-05 00:39:49