如何使用FileStream读取大于2 GB的大文件

Mur*_*sli 2 .net file filestream

如果我有一部电影(MKV)和它的大小像7 GB我怎么能在FileStream中读取它...我们知道int的最大大小约为2,147 MB​​ ..如何从索引3G.B开始读取..因为FileStream中的.Read()方法将偏移量作为一个整数,其中3 GB超出了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) );
}
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 10

那读不符合你的想法.

偏移量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
Run Code Online (Sandbox Code Playgroud)

在该示例中,包含的文件aaaaaaaabbbbbbbbcccccccc将最终在缓冲区中:

aaaaaaaaccccccccbbbbbbbb
Run Code Online (Sandbox Code Playgroud)

您需要先查找,并将其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 );
}
Run Code Online (Sandbox Code Playgroud)

Seek文件当前位置的更改(它将从中读取和/或写入的位置,具体取决于您调用的打开模式和函数).

因此,fs.Seek (start, SeekOrigin.Begin)将文件指针设置为文件start开头的字符.您还可以指定其他移动方法SeekOrigin.Begin,从当前位置搜索,如向前27个字节,或从文件末尾搜索.

全部细节可在MSDN两个SeekRead.