2011-08-23 83 views
3

http://msdn.microsoft.com/en-us/library/system.io.memorystream%28v=VS.90%29.aspx:一个无符号字节数组创建如何检查C#流是否可调整大小?

内存流提供的数据的 不可调整大小的流。当使用字节数组时,虽然您可能可以通过 修改现有内容,具体取决于传递给构造函数的参数 既不追加也不收缩流。空的内存流可调整大小,并且可以被写入和读取。

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

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

+0

如果在现有的字节数组'MemoryStream'构造函数传递,内存流仅仅是包装的阵列。所以自然不能调整数组和流的大小(通过扩展)。 –

回答

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; 
    } 
+0

有点奇怪,虽然这种区别存在,但没有财产。无论如何,我会将我收到的任何流复制到我创建的全新可调整大小的流中,以确保可调整性。 – Kache

2

编辑:下面的解决方案不会为使用该MemoryStream(byte[], int, int, bool, bool)构造函数的最后一个参数publiclyVisible设置为true创建MemoryStreams工作。


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; 
} 
+0

很高兴知道ctor中的特定参数。嗯......我喜欢尝试“GetBuffer()”而不是尝试调整大小的选项。但是如果这个Stream有一个合适的属性获取器,它会更有意义。 – IAbstract

相关问题