C # Приведение MemoryStream к FileStream - PullRequest
6 голосов
/ 28 ноября 2011

Мой код такой:

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 ]

16 голосов
/ 28 ноября 2011

A MemoryStream не связан с файлом и не имеет понятия имени файла. По сути, вы не можете этого сделать.

Вы, конечно, не можете использовать их между собой; вы можете бросать только вверх, а не вниз; для визуализации:

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

Вы можете привести MemoryStream к Stream тривиально, а Stream к MemoryStream с помощью проверки типов; но никогда от FileStream до MemoryStream. Это все равно что сказать, что собака - это животное, а слон - это животное, поэтому мы можем бросить собаку в слона.

Вы могли бы подкласс MemoryStream и добавить свойство Name (для которого вы указали значение), но между FileStream и YourCustomMemoryStream все равно не было бы общего и FileStream не реализует ранее существующий интерфейс для получения Name; так что вызывающий должен будет явно обрабатывать оба по отдельности, или использовать утку (возможно, с помощью dynamic или отражения).

Другой вариант (возможно, более простой) может быть следующим: записать ваши данные во временный файл; используйте FileStream оттуда; затем (позже) удалите файл.

4 голосов
/ 28 ноября 2011

Вы можете сравнить Stream с животным, MemoryStream с собакой и FileStream с кошкой.Хотя собака - это животное, а кошка - это животное, собака, конечно, не кошка.

Если вы хотите копировать данные из одного потока в другой, вам нужно будет создать оба потока, считывать изодин и пиши другому.

3 голосов
/ 28 ноября 2011

Эта операция невозможна.И FileStream, и MemoryStream напрямую получены из Stream, поэтому они являются типами-братьями.В общем случае в следующем сценарии:

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

Невозможно привести B к C или наоборот.Между В и С нет отношения "есть".

...