2010-06-04 18 views
11

¿Cuál es la forma correcta de crear de manera segura un directorio temporal en Haskell? System.IO ofrece formas de crear archivos temporales , pero no puedo encontrar nada que haga lo mismo para los directorios, ni allí ni en System.Directory, System.Posix.Directory ni System.Posix.Temp. ¿Hay alguna función que pase por alto o debo escribir una? (? Y si es así, ¿existen peligros para evitar, como hay con la creación de archivos temporales)Crear un directorio temporal en Haskell

Respuesta

6

Para el trabajo específico con los sistemas Unix, el paquete Unixutils contiene una función de este tipo:

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

Si necesita que funcione tanto en sistemas Windows como Unix; en su lugar, querrá usar el paquete temporal. Tiene la misma función con una firma de tipo ligeramente diferente:

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

+1

Esto devuelve el directorio donde se crearán los nuevos archivos temporales (es decir, generalmente "/ tmp"). En realidad, no crea un directorio temporal. –

+0

@Travis ACK! withTemporaryDirectory era lo que estaba buscando. –

+0

Esto encaja muy bien con el uso que tenía en mente, ya que automatiza la limpieza del directorio cuando lo he terminado. –

2

Se podría buscar en el módulo Distribution.Compat.TempFile de la fuente de Cabal para un ejemplo. En él se definen de la siguiente manera createTempDirectory (donde c_getpid y mkPrivateDir son específicos de la plataforma):

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 

El hecho de que Cabal define esta función sugiere que no hay una forma estándar de hacerlo.

+3

Esta funcionalidad ahora se ha incluido en el paquete ['temporary'] (http://hackage.haskell.org/package/temporary). – bgamari

0

Como sugiere @Nikita Volkov, Estoy publicar el comentario del @Thomas M. Dubuisson como una respuesta por separado:

utilizar el paquete temporary. Proporciona una conveniente API independiente de la plataforma para usar archivos y directorios temporales. Los archivos y directorios temporales se eliminan automáticamente después de su uso.

Cuestiones relacionadas