Создайте временный каталог в Haskell

Что надлежащий путь состоит в том, чтобы безопасно создать временный каталог в Haskell? System.IO предложения способы создать временные файлы, но я не могу найти ничего, что делает то же для каталогов, ни там, ни в System.Directory, System.Posix.Directory, ни System.Posix.Temp. Существует ли функция, которую я пропускаю, или я должен записать тот сам? (И если так, есть ли какие-либо опасности избежать, как существует с созданием временных файлов?)

11
задан Paul Kuliniewicz 4 June 2010 в 22:31
поделиться

2 ответа

Для работы с системами Unix пакет Unixutils содержит такую ​​функцию:

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

Если вы необходимо, чтобы он работал как в системах Windows, так и в системах Unix, вместо этого вы захотите использовать временный пакет. Он имеет ту же функцию с немного другой подписью типа:

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

7
ответ дан 3 December 2019 в 10:03
поделиться

Для примера вы можете посмотреть на модуль 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 определяет эту функцию, говорит о том, что стандартного способа сделать это не существует.

2
ответ дан 3 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: