2011-10-04 8 views
6

me sale el siguiente error en la segunda iteración del bucle de mi:
Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection.archivo de lectura de error en una matriz

y este es mi lazo

FileStream fs = new FileStream("D:\\06.Total Eclipse Of The Moon.mp3", FileMode.Open); 

    byte[] _FileName = new byte[1024]; 
    long _FileLengh = fs.Length; 

    int position = 0; 

    for (int i = 1024; i < fs.Length; i += 1024) 
    { 
     fs.Read(_FileName, position, Convert.ToInt32(i)); 

     sck.Client.Send(_FileName); 
     Thread.Sleep(30); 

     long unsend = _FileLengh - position; 

     if (unsend < 1024) 
     { 
      position += (int)unsend; 
     } 
     else 
     { 
      position += i; 
     } 
    } 
    fs.Close(); 
} 

fs.Length = 5505214 

Respuesta

12

En la primera iteración, que está llamando

fs.Read(_FileName, 0, 1024); 

eso está bien (aunque por qué usted está llamando Convert.ToInt32 en una int, no lo saben.)

En la segunda iteración, que vamos a llamar

fs.Read(_FileName, position, 2048); 

que está intentando leer en la matriz de bytes a partir de las _FileNameposition (que no es cero) y yendo a parar a 2048 bytes. La matriz de bytes tiene solo 1024 bytes de longitud, por lo que no puede funcionar posiblemente.

problemas adicionales:

  • no ha utilizado un comunicado using, etc. excepciones que a dejar el flujo abierto
  • Estás ignorando el valor de retorno de Read, lo que significa que don' t saber cuánto de su memoria intermedia tiene en realidad leído
  • Está enviando incondicionalmente al socket el búfer completo, independientemente de cuánto se haya leído.

Su código probablemente debería ser de la misma familia:

using (FileStream fs = File.OpenRead("D:\\06.Total Eclipse Of The Moon.mp3")) 
{ 
    byte[] buffer = new byte[1024]; 
    int bytesRead; 
    while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     sck.Client.Send(buffer, 0, bytesRead); 
     // Do you really need this? 
     Thread.Sleep(30); 
    } 
} 
+0

fs.Read (_FileName, posición, 2048); << posición = 1024, 2048 - 1024 = 1024 entonces mi _FileName = 1024 hay suficiente espacio para eso –

+1

@Acid: Pero usted está diciendo que quiere comenzar a leer en el índice 1024 de '_FileName'. No * hay * ningún índice de este tipo: el último índice de la matriz es 1023. Lea la documentación de 'Stream.Read' - No creo que comprenda para qué sirven los parámetros segundo y tercero. –

+1

La última oración en realidad me hizo notar que no interpreté el parámetro 'offset'. Pensé que estaba relacionado con el flujo de la fuente, no el buffer. Me ayudó a solucionar un error crítico, ¡gracias! – wodzu

Cuestiones relacionadas