F# 异步解压缩gzip文件

F# 异步解压缩gzip文件,f#,F#,作为一个F#培训,我正在尝试解压缩一个gzip文件。以下是我编写的代码: let decompress (inputStream: Stream) (outputStream : Stream) = async { use gs = new GZipStream(inputStream, CompressionMode.Decompress) let buffer = Array.zeroCreate<byte> 4096 let rec decompres

作为一个F#培训,我正在尝试解压缩一个gzip文件。以下是我编写的代码:

let decompress (inputStream: Stream) (outputStream : Stream) = async {
    use gs = new GZipStream(inputStream, CompressionMode.Decompress)
    let buffer = Array.zeroCreate<byte> 4096

    let rec decompressInternal() = async {
        let! read = gs.ReadAsync(buffer, 0, buffer.Length) |> Async.AwaitTask
        match read with
        | 0 ->
            inputStream.Dispose()
            return ()
        | _ ->
            do! outputStream.WriteAsync(buffer, 0, read) |> Async.AwaitTask |> Async.Ignore
            return! decompressInternal()
    }

    return! decompressInternal()
}
let解压缩(inputStream:Stream)(outputStream:Stream)=异步{
使用gs=new GZipStream(inputStream,CompressionMode.decompresse)
让buffer=Array.zeroCreate 4096
让rec解压缩internal()=异步{
让!read=gs.ReadAsync(buffer,0,buffer.Length)|>Async.task
匹配阅读
| 0 ->
inputStream.Dispose()
返回()
| _ ->
do!outputStream.WriteAsync(缓冲区,0,读取)|>Async.AwaitTask |>Async.Ignore
return!解压缩internal()
}
return!解压缩internal()
}
我还编写了一个单元测试,暂时失败(我得到一个空字符串,好像断言发生在解压缩操作之后):

[]
让“解压缩一个gzip文件”`()=
使用fs=newfilestream(“Input/test.txt.gz”,FileMode.Open)
使用ms=newmemoryStream()
解压缩fs ms |>Async.RunSynchronously
使用sr=新的StreamReader(毫秒)
Assert.Equal(“这是一个测试”,sr.ReadToEnd())

我想我弄错了一个F#async的能力,但我看不出我的错误…

你对async的使用非常好。您只有一个
MemoryStream
,它的位置仍然在写入之后,因此没有任何内容可从中读取。在创建
StreamReader
之前,请使用以下步骤重置位置,该操作将正常工作:

ms.Seek(0L, SeekOrigin.Begin) |> ignore
ms.Seek(0L, SeekOrigin.Begin) |> ignore