2012-04-06 21 views
5

Ben sıkıştırılabilir bir dosyayı okumak için bu kod parçacığını yazdı: Sadece iyi derlerIOError'ın sıkıştırması nasıl yapılır?

import Codec.Compression.GZip 
import IO -- using IO.try 

read file = do 
    let f = L.readFile file 
    let c = fmap decompress $ f 

    unzipped <- try c 

    case unzipped of 
    Right b -> return b 
    Left _ -> f 

, ancak bu sıkıştırılmamış dosyaları işlemek için hiçbir geçerli bir yol gibi görünüyor. sıkıştırılmış dosya üzerinde kod çalıştırma güzel çalışır, ancak bir sıkıştırılmamış dosya bir durumla başarısız: Bunu mümkün kılmak için nasıl

*** Exception: Codec.Compression.Zlib: incorrect header check 

bir fikrin?

+0

'IO.try' kullanımdan kaldırılmıştır (Sana Data.ByteString.Lazy L. olarak nitelendirilen ithal var tahmin) ... Control.Exception.try' hakkında ne? http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Exception.html#v:try –

+2

Daha da önemlisi, 'IO.try' özellikle saf kodundan istisnalar yakalamaz Control.Exception.try ise. – dave4420

cevap

4

Sen Codec.Compression.Zlib.Internal ithalat gerekir. Not özellikle “Low-level API to get explicit error reports” başlıklı bölüm.

Sen (denenmemiş unutmayın) böyle bir şey kullanmak isteyeceksiniz:

import qualified Codec.Compression.Zlib.Internal as Z 
import Control.Arrow (right) 

decompressWithoutExceptions :: L.ByteString -> Either Z.DecompressError L.ByteString 
decompressWithoutExceptions = finalise 
          . Z.foldDecompressStream cons nil err 
          . Z.decompressWithErrors Z.gzipFormat Z.defaultDecompressParams 
    where err errorCode errorString = Left errorCode 
     nil = Right [] 
     cons chunk = right (chunk :) 
     finalise = right L.fromChunks 

+0

wow ... burada neler olduğunu açıklayabilir misiniz? :) – fho

+0

Bunu boşver, işe yarıyor mu ?! (Hangi bitleri anlamıyorsunuz? '' DecompressWithErrors' ve 'foldDecompressStream', vb. Bağlandığım belgelerde açıklanmaktadır (belki de yeterince açık değil?).) – dave4420

+0

Bu sonlandırma yöntemi nereden geliyor? Hayoo ile bulamadım. Son satırda – fho

2

Bir istisna atılmışsa Nothing alabilmeniz için spoon'a bakmak isteyebilirsiniz.

İlgili konular