2010-06-29 136 views
1

我試圖找到一種方法來讀取流的一部分。我有一個40000字節的流,只需要從位置8000讀到15000,可能有些容易,但我似乎無法找到一個簡單的方法來獲取流段。.Net從流中讀取流段

+0

您是否需要將該段傳遞給另一段代碼,這段代碼需要一個只包含數據段的流?例如,您已將.PNG文件放在另一個文件中,並且希望使用Image.FromStream或類似的語言來加載PNG,但傳遞整個流失敗,因此您需要一個新的類似Stream的對象,只允許訪問PNG內容? – 2010-06-29 14:52:53

回答

0

由於讀取數據流的一部分,應該是很容易,我假設你實際上需要一個新的Stream對象,它只訪問基礎流的給定片段。

即。你想是這樣的:

Stream segment = new StreamSegment(underlyingStream, 8000, 7000); 

我有這樣一個類,你可以在這裏找到:LVK.IO.PartialStream。它依賴於我的類庫中的其他類,特別是LVK.IO.WrapperStream,但是您可以在其中找到所有這些,只需抓取您實際需要的幾個文件即可(如果您決定使用它們)。

要使用它,您必須指定您的PartialStream對象是否擁有基礎流。如果是這樣,當你拋棄PartialStream對象時,它也會拋棄基礎流。

因此,對於上面的例子:(或者通過true作爲第二個參數)

Stream segment = new PartialStream(underlyingStream, false, 8000, 7000); 

假設它不應該擁有基礎流

注:

  • 構建上面的PartialStream對象會將基礎流重新定位到該段的開始位置(上例中的位置8000)。
  • 在使用部分流對象時,不應使用基礎流,因爲有一些內部簿記與段內的位置有關。如果您重新定位基礎流而不經過部分流,則行爲是未定義的。
+1

答案中的鏈接似乎被打破。你把項目搬到別的地方了嗎? – 2017-03-14 12:36:36

2

如果流支持查找,你可以跳到的位置,否則,您必須讀取流達到那個位置:

if (theStream.CanSeek) { 
    theStream.Seek(8000, SeekOrigin.Current); 
} else { 
    // read 8000 bytes and throw away 
} 
// read the 7000 bytes to keep