Что надлежащий путь состоит в том, чтобы безопасно создать временный каталог в Haskell? System.IO
предложения способы создать временные файлы, но я не могу найти ничего, что делает то же для каталогов, ни там, ни в System.Directory
, System.Posix.Directory
, ни System.Posix.Temp
. Существует ли функция, которую я пропускаю, или я должен записать тот сам? (И если так, есть ли какие-либо опасности избежать, как существует с созданием временных файлов?)
Для работы с системами Unix пакет Unixutils содержит такую функцию:
withTemporaryDirectory :: FilePath -> (FilePath -> IO a) -> IO a
Если вы необходимо, чтобы он работал как в системах Windows, так и в системах Unix, вместо этого вы захотите использовать временный пакет. Он имеет ту же функцию с немного другой подписью типа:
withTemporaryDirectory :: FilePath -> String -> (FilePath -> IO a) -> IO a
Для примера вы можете посмотреть на модуль 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 определяет эту функцию, говорит о том, что стандартного способа сделать это не существует.