2011-10-19 39 views
6

Hice un método rápido para escribir un archivo desde una transmisión pero aún no está hecho. Recibo esta excepción y no puedo encontrar qué:No se puede leer más allá del final de la secuencia

Unable to read beyond the end of the stream 

¿Hay alguien que me pueda ayudar a depurarlo?

public static bool WriteFileFromStream(Stream stream, string toFile) 
{ 
    FileStream fileToSave = new FileStream(toFile, FileMode.Create); 
    BinaryWriter binaryWriter = new BinaryWriter(fileToSave); 

    using (BinaryReader binaryReader = new BinaryReader(stream)) 
    { 
     int pos = 0; 
     int length = (int)stream.Length; 

     while (pos < length) 
     { 
      int readInteger = binaryReader.ReadInt32(); 

      binaryWriter.Write(readInteger); 

      pos += sizeof(int); 
     } 
    } 

    return true; 
} 

¡Muchas gracias!

Respuesta

5
No

realmente una respuesta a su pregunta, pero este método podría ser mucho más simple como esto:

public static void WriteFileFromStream(Stream stream, string toFile) 
{ 
    // dont forget the using for releasing the file handle after the copy 
    using (FileStream fileToSave = new FileStream(toFile, FileMode.Create)) 
    { 
     stream.CopyTo(fileToSave); 
    } 
} 

Tenga en cuenta que también se elimina el valor de retorno desde su bastante inútil ya que en su código, solo hay 1 declaración de devolución

Aparte de eso, usted realiza una verificación de longitud en la transmisión, pero muchas secuencias no admiten verificar longitud.

En cuanto a su problema, primero compruebe si la transmisión se encuentra al final. Si no, lees 4 bytes. Aquí está el problema Digamos que tienes un flujo de entrada de 6 bytes. Primero, comprueba si la transmisión está en su final. La respuesta es no, ya que quedan 6 bytes. Lees 4 bytes y vuelves a verificar. Por supuesto, la respuesta sigue siendo no, ya que quedan 2 bytes. Ahora lees otros 4 bytes pero eso por supuesto falla, ya que solo hay 2 bytes. (readInt32 lee los siguientes 4 bytes).

+0

Increíble, ¡mucho más simple como dijiste! Muchas gracias :-) – TomShreds

1

Está haciendo while (pos < length) y length es la longitud real de la secuencia en bytes. Entonces, efectivamente está contando los bytes en la transmisión y luego tratando de leer ese número de entradas (lo cual es incorrecto). Puede tomar la longitud para ser stream.Length/4 ya que un Int32 es de 4 bytes.

0

tratar

int length = (int)binaryReader.BaseStream.Length; 
2

supongo que el flujo de entrada tiene solamente enteros (Int32). Es necesario poner a prueba el método PeekChar(),

while (binaryReader.PeekChar() != -1) 
{ 
    int readInteger = binaryReader.ReadInt32(); 
    binaryWriter.Write(readInteger);   
} 
+0

tenga en cuenta que esto no es eficiente en absoluto. 'PeekChar' en realidad guardará la Posición actual de la transmisión principal, leerá un int, ¡y establecerá nuevamente la posición! –

0

Después de leer el flujo por el lector binario, la posición de la secuencia se encuentra al final, debe establecer la posición en cero "stream.position = 0;"

Cuestiones relacionadas