如何检查C#Stream是否可以调整大小?

时间:2011-08-23 21:55:40

标签: c# stream memorystream

来自http://msdn.microsoft.com/en-us/library/system.io.memorystream%28v=VS.90%29.aspx

  

使用无符号字节数组创建的内存流提供了一个   不可调整大小的数据流。使用字节数组时,您可以   尽管你可以,但是既不会附加也不会缩小流   根据传入的参数修改现有内容   构造函数。空内存流可以调整大小,也可以   写作和阅读。

当提供对MemoryStream(或甚至只是Stream)的引用时,如何检查它是否可调整大小?

使用OpenXML SDK时会出现这种情况,这需要传递给它的流可以调整大小。我可以通过深度复制到可调整大小的流来确保可恢复性,我只是想知道当一个错误的参数传递给它时(即一个不可调整的流)库是否没有抛出异常的特殊原因。

2 个答案:

答案 0 :(得分:2)

在尝试调整大小时,您会捕获NotSupportedException,这有一种丑陋的方式。

public static bool IsResizable(this Stream stream)
    {
        bool result;
        long oldLength = stream.Length;

        try
        {
            stream.SetLength(oldLength + 1);
            result = true;
        }
        catch (NotSupportedException)
        {
            result = false;
        }

        if (result)
        {
            stream.SetLength(oldLength);
        }

        return result;
    }

答案 1 :(得分:2)

编辑:以下解决方案不适用于使用MemoryStream(byte[], int, int, bool, bool)构造函数创建的MemoryStream,最后一个参数publiclyVisible设置为true。< / p>


根据MSDNMemoryStream.GetBuffer如果未使用“公开可见缓冲区”创建对象,则会抛出UnauthorizedAccessException。使用公开可见缓冲区列出的构造函数可以方便地映射到可调整大小的那些构造函数。因此,您可以通过选中GetBuffer

来检查它是否可以调整大小
public static bool IsResizable(this MemoryStream stream)
{
    if (stream == null) throw new ArgumentNullException("stream");

    bool resizable;
    try
    {
        stream.GetBuffer();
        resizable = true;
    }
    catch (UnauthorizedAccessException) { resizable = false; }

    return resizable;
}