如何捕获解压缩IOError?

时间:2012-04-06 11:52:41

标签: haskell gzip

我编写了这段代码片段来读取可能被压缩的文件:

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

它编译得很好,但似乎这不是处理未压缩文件的有效方法。在压缩文件上运行代码效果很好,但是未压缩的文件失败并出现异常:

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

有关如何实现这一目标的任何想法吗?

2 个答案:

答案 0 :(得分:4)

您需要导入Codec.Compression.Zlib.Internal。请特别注意标题为“Low-level API to get explicit error reports”

的部分

你会想要使用这样的东西(注意未经测试):

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

(我假设您已将Data.ByteString.Lazy导入为L。)

答案 1 :(得分:2)

您可能需要查看spoon,如果抛出异常,您将获得Nothing