我编写了这段代码片段来读取可能被压缩的文件:
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
有关如何实现这一目标的任何想法吗?
答案 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
。