我应该如何包装一个MemoryStream来访问写入它的数据,即使它已经关闭

时间:2015-03-09 10:00:34

标签: c# stream

我正在尝试使用ThirdParty库将一些数据写入MemoryStream,以便我可以将输出作为某些单元测试的一部分进行比较。不幸的是,第三方库在执行它Save()方法时关闭了MemoryStream。

因此我有以下代码:

byte[] expected = LoadExpectedResult("Test1");
using (var memoryStream = new MemoryStream()) {
    ThirdPartyLibrary.Save(memoryStream);
    var result = memoryStream.ToArray();
    ConfirmBinaryBlobsAreSufficentlyEqual(expected, result);
}

不幸的是,memoryStream.ToArray()函数似乎只返回最后加载到缓冲区中的最后3398个字节,因为它已作为保存过程的一部分进行处理。

我是否可以将MemoryStream包装起来,以便在向其写入数据时,将其读出或写入另一个内存流,以便在处理时我仍然可以访问数据。

更新

为了清楚起见,Save()方法也会在调用MemoryStream为空之前进行写出。我认为图书馆的作者希望你只传入FileStreams。

2 个答案:

答案 0 :(得分:2)

您可以尝试:

public class MyMemoryStream : MemoryStream
{
    public bool CanDispose { get; set; }

    public override void Close()
    {
        if (!CanDispose)
        {
            return;
        }

        base.Close();
    }
}

在Stream类中,Dispose()调用Close()然后调用Dispose(bool disposing)Close()virtual,因此我将其覆盖。

使用流后,设置CanDispose = true,然后让它正常处理。

byte[] expected = LoadExpectedResult("Test1");
using (var memoryStream = new MyMemoryStream()) {
    // implicitly memoryStream.CanDispose == false;
    ThirdPartyLibrary.Save(memoryStream);
    var result = memoryStream.ToArray();
    ConfirmBinaryBlobsAreSufficentlyEqual(expected, result);
    memoryStream.CanDispose = true;
}

答案 1 :(得分:0)

规避错误/行为:您可以将内存流复制到第二个实例,或者在调用ThirdPartyLibrary.Save之前将其写入某个临时文件。