2011-08-18 15 views

Respuesta

11

El offset aquí está el desplazamiento en el conjunto en el que comenzar a escribir. En su caso, acaba de establecer:

stream.Position = 3147483648; 

y luego usar Read(). El offset se utiliza con mayor frecuencia cuando se sabe que necesita para leer [n] bytes:

int toRead = 20, bytesRead; 
while(toRead > 0 && (bytesRead = stream.Read(buffer, offset, toRead)) > 0) 
{ 
    toRead -= bytesRead; 
    offset += bytesRead; 
} 
if(toRead > 0) throw new EndOfStreamException(); 

esta leerá exactamente 20 bytes en buffer (o lanzar una excepción). Tenga en cuenta que no se garantiza que Read() lea todos los datos requeridos de una vez, por lo tanto, generalmente se requiere un bucle que incrementa un desplazamiento.

+0

Pero lo que ocurre cuando pasa por encima de desplazamiento int.MaxValue? ¿Cómo manejarías eso? – tayl0rs

+1

@ tayl0rs, ya que el tamaño máximo de la matriz para el búfer se excedería en ese punto, es una cuestión discutible. Incluso con el soporte de matriz muy grande habilitado, no puede excederlo en ninguna dimensión; vea "observaciones" aquí: https://msdn.microsoft.com/en-us/library/hh285054(v=vs.110).aspx (y tenga en cuenta: el desplazamiento se relaciona con la matriz, no con la secuencia) –

1

Según http://msdn.microsoft.com/en-us/library/system.io.filestream.read.aspx el parámetro offset es un offset inside the byte[] array:

array Tipo: System.Byte [] Cuando devuelve este método contiene la matriz de bytes especificado con los valores entre offset y (offset + count - 1) reemplazado por bytes leídos de la fuente actual.

offset Tipo: System.Int32 El byte se compensa en el conjunto en el que se colocarán los bytes leídos.

cuenta Tipo: System.Int32 El número máximo de bytes para leer.

Read() simplemente lee desde el positon corriente que pasa a ser un long y debe ser establecido antes de llamar Read() ver http://msdn.microsoft.com/en-us/library/system.io.filestream.position.aspx

Cuestiones relacionadas