2011-11-28 31 views
6

Mi código es la siguiente:C# Fundición MemoryStream a FileStream

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

tarde estoy usando file.Name.

Recibo un InvalidCastException: muestra la siguiente

No se puede convertir objeto de tipo 'System.IO.MemoryStream' al tipo 'System.IO.FileStream'.

Leí en alguna parte que debería cambiar FileStream a Stream. ¿Hay algo más que deba hacer?

+3

Este enfoque es incorrecto. ¿Qué estás intentando lograr? – Snowbear

+4

No está claro qué es lo que quiere hacer. Un 'MemoryStream' definitivamente no se puede convertir a' FileStream', y mientras se puede convertir a 'Stream', esa clase no tiene una propiedad' .Name'. ¿Qué es lo que estás tratando de hacer? ¿Qué nombre estás buscando? –

Respuesta

16

A MemoryStream no está asociado a un archivo y no tiene ningún concepto de nombre de archivo. Básicamente, no puedes hacer eso.

Ciertamente no se puede transmitir entre ellos; solo puedes lanzar hacia arriba y hacia abajo, no hacia los lados; visualizar:

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

usted puede echar un MemoryStream a un Stream trivialmente, y una Stream a un MemoryStream a través de un tipo a comprobar; pero nunca un FileStream a un MemoryStream. Eso es como decir que un perro es un animal, y un elefante es un animal, por lo que podemos lanzar un perro a un elefante.

Usted podría subclase MemoryStream y añade una propiedad Name (que proporcione un valor para), pero todavía habría nada en común entre un FileStream y una YourCustomMemoryStream y FileStream no implementa una interfaz preexistente a obtener un Name; por lo que la persona que llama tendría que manejar explícitamente ambos por separado, o usar pato-tipado (tal vez a través de dynamic o reflejo).

Otra opción (quizás más fácil) podría ser: escribir sus datos en un archivo temporal; use un FileStream desde allí; luego (más tarde) borre el archivo.

3

Esta operación no es posible. Ambos FileStream y MemoryStream se derivan directamente de Stream, por lo que son tipos de hermanos. En general, en el siguiente escenario:

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

No es posible emitir B a C o viceversa. No existe una relación "is-a" entre B y C.

4

Puede comparar Stream con animal, MemoryStream con perro y FileStream con cat. Aunque un perro es un animal, y un gato es un animal, un perro ciertamente no es un gato.

Si desea copiar datos de una secuencia a otra, tendrá que crear ambas secuencias, leer de una y escribir en la otra.