Как читать большие файлы более 2 ГБ, используя FileStream - PullRequest
2 голосов
/ 19 января 2012

Если у меня есть фильм (MKV) и его размер, например, 7 G.B, как я могу прочитать его в FileStream .. мы знаем, что максимальный размер int составляет около 2147 МБ .. как начать чтение с индекса 3G.B .. поскольку метод .Read () в FileStream принимает смещение в виде целого числа, для которого 3 ГБ находится вне диапазона int .. ??? * * тысяча одна

private void readingLargeFile(string path)
{
   int start = 3*(1024*1024*1024); 

   FileStream fs = new FileStream(path,FileMode.Open);
   fs.Read(data, start, (1024*8) );
}

1 Ответ

10 голосов
/ 19 января 2012

Это чтение не делает то, что вы думаете.

Смещение в 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.

...