将C#中的MemoryStream转换为FileStream

6

我的代码如下:

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 属性。您是想做什么?您需要哪个名称? - Lasse V. Karlsen
3个回答

19

一个MemoryStream没有关联任何文件,也没有文件名的概念。基本上,你不能这样做。

你肯定不能在它们之间进行强制转换;你只能向上和向下转换,而不能向左或向右转换。如图所示:

        Stream
          |
   ---------------
   |             |
FileStream    MemoryStream
你可以将 MemoryStream 轻易地转换为 Stream,并通过类型检查将 Stream 转换为 MemoryStream,但是永远不要将 FileStream 转换为 MemoryStream。这就像说狗是动物,大象也是动物,所以我们可以将一只狗变成一头大象。
你可以添加一个 Name 属性(由你提供值)来子类化 MemoryStream,但是 FileStream 和你的自定义内存流之间仍然没有共同点,并且 FileStream 没有实现一个预先存在的接口来获取 Name;因此,调用者必须显式地单独处理两者,或使用鸭子类型(可能通过 dynamic 或反射)。
另一个选项(可能更容易)是:将数据写入临时文件;从那里使用 FileStream;然后(稍后)删除文件。

5

您可以将Stream比作动物,MemoryStream比作狗,FileStream比作猫。虽然狗和猫都是动物,但狗显然不是猫。

如果您想将数据从一个流复制到另一个流,您需要创建两个流,从一个流中读取并写入到另一个流中。


3

此操作不可行。 FileStreamMemoryStream 都是直接从 Stream 派生的,因此它们是兄弟类型。通常,在以下场景中:

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

无法将B强制转换为C或反之。B和C之间没有“是一个”关系。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接