F# 异步解压缩gzip文件
作为一个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
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