2011-08-23 28 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

相關問題