Это чтение не делает то, что вы думаете.
Смещение в Read
- это смещение от начала буфера , с которого начинается запись данных,это не смещение в файле , с которого начинается чтение.
Обычно оно ненулевое, если вы уже частично заполнили буфер и хотите добавить немного больше:
fs.Read (data, 0, 8 ); // Put first 8 bytes of file at buffer start
fs.Read (data, 16, 8 ); // Put next 8 bytes of file at buffer end
fs.Read (data, 8, 8 ); // Put first 8 bytes of file at buffer middle
В этом примере файл, содержащий aaaaaaaabbbbbbbbcccccccc
, окажется в буфере следующим образом:
aaaaaaaaccccccccbbbbbbbb
Сначала необходимо выполнить поиск, и для него используется long
в качествезначение смещения, поэтому он должен иметь возможность легко обрабатывать файлы 8G.Примерно так будет хорошей отправной точкой:
private void readingLargeFile (string path) {
long start = 3L * 1024L * 1024L * 1024L;
FileStream fs = new FileStream (path, FileMode.Open);
fs.Seek (start, SeekOrigin.Begin)
fs.Read (data, 0, 8 * 1024 );
}
Seek
изменяется на текущую позицию файла (где он будет считывать и / или записывать, в зависимости от режима открытия и функций, которые выcall).
Таким образом, fs.Seek (start, SeekOrigin.Begin)
установит указатель файла на start
символов от начала файла.Вы также можете указать другие методы перемещения, кроме SeekOrigin.Begin
, поиск с текущей позиции, например, на 27 байт вперед, или поиск с конца файла.
Полная информация доступна на MSDN для обоих Seek
и Read
.