2017-09-03 10 views
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つを誤解したと思うが、私は私の間違いを見ることができない...

答えて

4

あなたのAsyncの使用は完全に素晴らしいです。 MemoryStreamの位置が書き込み後でもあるので、そこから読み取るものはありません。位置をリセットするにはStreamReaderを作成する前に次の操作を行ってください。

ms.Seek(0L, SeekOrigin.Begin) |> ignore 
関連する問題