2014-08-29 96 views
1

我有一个大小为4.5GB的文本文件,它是由一个实验应用程序创建的。在我的8GB RAM系统上,该文件无法打开(使用崇高文本进行尝试)。我只想从结尾中读取这个文件的内容,比如说从最后45个字符开始,而不是将整个文件加载到内存中。这个怎么做 ? 内置的方法等,如何在C#中读取非常庞大的文件?

StreamReader.ReadBlock(char[] buffer,int index,int count) 

具有类型INT为指数,但对于我的情况下,索引超出为int值的范围内的。如果只有长时间的超载。如何克服这一点?谢谢。

+4

去oldschool? FOPEN/FSEEK? – 2014-08-29 19:36:50

+5

['FileStream.Seek(long offset,SeekOrigin origin)'](http://msdn.microsoft.com/en-us/library/system.io.filestream.seek(v = vs.110).aspx)? Darin Dimitrov显示了一个示例如何执行此操作:http://stackoverflow.com/questions/4368857/read-from-a-file-starting-at-the-end-similar-to-tail – birryree 2014-08-29 19:37:23

+0

什么编码是文本文件在?如果是UTF-8,你能保证文件中只有单字节宽字符吗? – 2014-08-29 19:40:39

回答

3

A Stream具有long特性PositionLength。您可以将Position设置为[0, Length[范围内的任意值,如fileStream.Position = fileStream.Length - 45;

或者,您可以使用Stream.Seek函数:fileStream.Seek(-45, SeekOrigin.End)

根据周围的代码和情况,使用可读性更强的文档,这是最能表达您意图的文字。

下面是一些代码:

using (var fileStream = File.OpenRead("myfile.txt")) 
using (var streamReader = new StreamReader(fileStream, Encoding.ASCII)) 
{ 
    if (fileStream.Length >= 45) 
     fileStream.Seek(-45, SeekOrigin.End); 

    var value = streamReader.ReadToEnd(); // Last 45 chars; 
} 

这是容易,因为你知道你的文件在ASCII编码。否则,您必须从读取文件的开头读取一些文本,让其检测编码(如果存在BOM),然后才能找到您想要读取的位置。

+1

问题是'StreamReader'不是从'Stream'派生的。你应该展示两者如何相互作用。 – 2014-08-29 19:45:52

+0

@Scott,我假定OP已经有一个文件流,但你说得对,这里有一些示例代码是合适的。 – 2014-08-29 19:52:46