如果我有一部电影(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) );
}
答案 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个字节,或从文件末尾搜索。