2010-06-04 16 views
11

Haskell'de güvenli bir şekilde geçici bir dizin oluşturmanın uygun yolu nedir? System.IO geçici dosyaları oluşturmak için yollar sunar, ancak ne için ne de ne System.Directory, System.Posix.Directory, ne de System.Posix.Temp dizinleri için aynı şeyi yapan bir şey bulamıyorum. Benim baktığım bir işlev var mı yoksa kendim yazmam mı gerekiyor?Haskell'de geçici bir dizin oluşturun

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

durumunda: (? Geçici dosyaları oluşturma ile var gibi Ve eğer öyleyse, önlemek için herhangi bir tehlike var) Unix sistemleri ile özellikle çalışma için

cevap

6

, Unixutils paket böyle bir işlev içerir Hem Windows hem de Unix sistemlerinde çalışmak için ihtiyacınız var, bunun yerine geçici paketi kullanmak isteyeceksiniz. Bu biraz daha farklı bir tip imzasıyla aynı işlevi vardır:

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

+1

Bu, yeni geçici dosyaların oluşturulacağı dizini döndürür (örneğin, genellikle "/ tmp"). Aslında geçici bir dizin oluşturmuyor. –

+0

@Travis ACK! withTemporaryDirectory, aradığım şeydi. –

+0

Bu, akılda tuttuğum kullanımla uyumludur, çünkü işim bittiğinde dizinin temizlenmesini otomatik hale getirir. –

2

Bir örnek Cabal kaynağının Distribution.Compat.TempFile modülünün bakabilir. O (c_getpid ve mkPrivateDir platforma özel durumda) aşağıdaki gibi createTempDirectory tanımlar:

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 bu işlevi tanımlar gerçeği bunu yapmak için standart bir yolu yoktur düşündürmektedir.

@Nikita Volkov tarafından önerildiği gibi
+3

Bu işlevsellik artık ['' '' '' '' '' '' '' geçici '' (http://hackage.haskell.org/package/temporary) paketine dahil edilmiştir. – bgamari

0

, ben ayrı bir cevap olarak @Thomas M. DUBUISSON ait yorumlar göndererek ediyorum:

temporary paketini kullanın. Geçici dosyaları ve dizinleri kullanmak için uygun bir platform bağımsız API sağlar. Geçici dosyalar ve dizinler kullanımdan sonra otomatik olarak silinir.

İlgili konular