Создайте временный каталог в Haskell - PullRequest
11 голосов
/ 05 июня 2010

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

Ответы [ 3 ]

7 голосов
/ 05 июня 2010

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

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

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

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

2 голосов
/ 05 июня 2010

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

0 голосов
/ 28 мая 2015

По предложению @Nikita Volkov, я публикую комментарий @Thomas M. DuBuisson в качестве отдельного ответа:

Используйте временный пакет. Он предоставляет удобный платформо-независимый API для использования временных файлов и каталогов. Временные файлы и каталоги автоматически удаляются после использования.

...