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

时间:2012-01-19 03:04:33

标签: .net file filestream

如果我有一部电影(MKV),它的大小像7 G.B我怎样才能在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) );
}

1 个答案:

答案 0 :(得分: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

使用该示例,包含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更改文件的当前位置(它将从中读取和/或写入,取决于您调用的打开模式和功能)。

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

MSDN上提供了SeekRead的详细信息。