FileStream, чтение данных из большого файла. Размер файла больше, чем int. Как установить смещение? - PullRequest
5 голосов
/ 18 августа 2011

FileStream.Read () определяется как:

public override int Read(
    byte[] array,
    int offset,
    int count
)

Как я могу прочитать некоторые байты со смещением больше, чем int.MaxValue?

Допустим, у меня очень большой файл, и я хочу прочитать 100 МБ, начиная с позиции 3147483648.

Как я могу это сделать?

Ответы [ 2 ]

11 голосов
/ 18 августа 2011

offset здесь - это смещение в массиве , с которого начинается запись.В вашем случае просто установите:

stream.Position = 3147483648;

и затем используйте Read().offset чаще всего используется, когда вы знаете, что вам нужно прочитать [n] байтов:

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

, это будет считывать ровно 20 байтов в buffer (или выдавать исключение).Обратите внимание, что Read() не гарантирует считывание всех необходимых данных за один раз, поэтому обычно требуется цикл, увеличивающий смещение.

1 голос
/ 18 августа 2011

Согласно http://msdn.microsoft.com/en-us/library/system.io.filestream.read.aspx параметр offset представляет собой offset inside the byte[] array:

Тип массива: System.Byte [] Когда этот метод возвращает, содержит указанный байтовый массив сзначения между смещением и (offset + count - 1) заменяются байтами, считанными из текущего источника.

offset Тип: System.Int32 Смещение байтов в массиве, в которое будут помещены считанные байты.

count Тип: System.Int32 Максимальное количество байтов для чтения.

Read() только что читает с текущей позиции, которая оказывается long и должна быть установлена ​​перед вызовомRead() см. http://msdn.microsoft.com/en-us/library/system.io.filestream.position.aspx

...