2011-08-18 2 views

risposta

11

Il offset qui è l'offset nell'array al quale iniziare a scrivere. Nel tuo caso, è sufficiente impostare:

stream.Position = 3147483648; 

e quindi utilizzare Read(). Il offset è più comunemente usato quando sai che hai bisogno di leggere [n] byte:

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

questo leggerà esattamente 20 byte in buffer (o un'eccezione). Si noti che Read() non è garantito per leggere tutti i dati richiesti in una volta sola, quindi è solitamente richiesto un incremento del ciclo di un offset.

+0

Ma cosa succede quando compensare va sopra int.MaxValue? Come lo gestiresti? – tayl0rs

+1

@ tayl0rs poiché la dimensione massima dell'array per il buffer sarebbe stata superata in quel punto, è un problema controverso. Anche con il supporto di array molto grandi abilitato, non è possibile superarlo in qualsiasi dimensione; vedi "osservazioni" qui: https://msdn.microsoft.com/en-us/library/hh285054(v=vs.110).aspx (e ricorda: l'offset si riferisce all'array, non al flusso) –

1

Secondo http://msdn.microsoft.com/en-us/library/system.io.filestream.read.aspx parametro offset è un offset inside the byte[] array:

matrice Tipo: System.Byte [] Quando questo metodo contiene il byte specificato con i valori tra offset e (offset + count - 1) sostituito dai byte letti dalla sorgente corrente.

offset tipo: System.Int32 Lo scostamento del byte nella matrice in cui verranno inseriti i byte di lettura.

conteggio Tipo: System.Int32 Il numero massimo di byte da leggere.

Read() legge solo dal positon corrente che risulta essere un long e deve essere impostata prima di chiamare Read() vedere http://msdn.microsoft.com/en-us/library/system.io.filestream.position.aspx