2011-11-28 108 views
6

我的代碼是這樣的:C#鑄造的MemoryStream對FILESTREAM

byte[] byteArray = Encoding.ASCII.GetBytes(someText); 
MemoryStream stream = new MemoryStream(byteArray); 
StreamReader reader = new StreamReader(stream); 
FileStream file = (FileStream)reader.BaseStream; 

後來我使用file.Name。

我得到一個InvalidCastException:它會顯示如下

無法轉換類型「System.IO.MemoryStream」的對象鍵入「System.IO.FileStream」。

我在某處讀到我應該將FileStream更改爲Stream。有什麼我應該做的嗎?

+3

這種方法是錯誤的。你想達到什麼目的? – Snowbear

+4

目前還不清楚你想要做什麼。一個'MemoryStream'絕對不能轉換爲'FileStream',並且當你可以轉換爲'Stream'時,該類沒有'.Name'屬性。你想要做什麼?你以後哪個名字? –

回答

16

A MemoryStream與文件沒有關聯,並且沒有文件名的概念。基本上,你不能那樣做。

你當然不能在它們之間施放;你只能向下傾斜 - 而不是側身;可視化:

 Stream 
      | 
    --------------- 
    |    | 
FileStream MemoryStream 

您可以通過投下MemoryStreamStream平凡和StreamMemoryStream類型檢查;但從來沒有FileStreamMemoryStream。這就像說狗是動物,而大象是動物,所以我們可以把狗給大象。

可以MemoryStream並添加Name屬性(您提供一個值),但仍然會有一個FileStreamYourCustomMemoryStreamFileStream之間沒有共性沒有實現預先存在的接口得到一個Name;因此呼叫者必須分別處理明確或使用鴨子鍵入(也許通過dynamic或反射)。

另一種選擇(可能更簡單)可能是:將數據寫入臨時文件;從那裏使用FileStream;然後(稍後)刪除該文件。

3

該操作是不可能的。 FileStreamMemoryStream都直接來自Stream,所以它們是兄弟類型。通常,在以下情況下:

public class A { } 
public class B : A { } 
public class C : A { } 

無法將B投射到C或反之亦然。 B和C之間沒有「is-a」關係。

4

您可以比較Stream與動物,MemoryStream與狗和FileStream與貓。雖然狗是動物,貓是動物,但狗當然不是貓。

如果您想將數據從一個數據流複製到另一個數據流,則需要創建兩個數據流,從一個數據流讀取數據並寫入另一個數據流。