2
F#トレーニングとして、gzipファイルを解凍しようとしています。ここで私が書いたコードは次のとおりです。gzipファイルを非同期で解凍する
[<Fact>]
let ``Decompress a gzipped file``() =
use fs = new FileStream("Input/test.txt.gz", FileMode.Open)
use ms = new MemoryStream()
decompress fs ms |> Async.RunSynchronously
use sr = new StreamReader(ms)
Assert.Equal ("This is a test", sr.ReadToEnd())
:私も一瞬(アサーションが解凍操作の後に発生したかのように、私は、空の文字列を取得する)ために失敗したユニットテストを書いた
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()
}
私はF#非同期capablibilitesの1つを誤解したと思うが、私は私の間違いを見ることができない...