如何在C#中从头到尾读取非常大的文件?

如何在C#中从头到尾读取非常大的文件?,c#,file,file-io,filestream,C#,File,File Io,Filestream,我有一个4.5GB大小的文本文件,它是由一个实验应用程序创建的。在我的8GB RAM系统上,无法打开此文件(尝试使用升华文本)。我只想从头到尾读取此文件的内容,比如说从头到尾读取45个字符,而不将整个文件加载到内存中。如何做到这一点? 内在的方法,比如 StreamReader.ReadBlock(char[] buffer,int index,int count) 索引的类型为int,但我案例的索引超出了int值的范围。要是有一个长时间的超负荷就好了。如何克服这个问题?谢谢。AStrea

我有一个4.5GB大小的文本文件,它是由一个实验应用程序创建的。在我的8GB RAM系统上,无法打开此文件(尝试使用升华文本)。我只想从头到尾读取此文件的内容,比如说从头到尾读取45个字符,而不将整个文件加载到内存中。如何做到这一点? 内在的方法,比如

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

索引的类型为int,但我案例的索引超出了int值的范围。要是有一个长时间的超负荷就好了。如何克服这个问题?谢谢。

A
Stream
具有名为
Position
Length
long
属性。您可以将
位置设置为
[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),然后再查找到您想要读取的位置。

转到oldschool?fopen/fseek??Darin Dimitrov演示了一个示例如何执行此操作:文本文件采用什么编码?如果是UTF-8,您能否保证文件中只有单字节宽的字符?@ScottChamberlain是的,因为输出来自我自己的应用程序,所以它是有保证的该文件仅由ASCII字符组成。@Birryrree谢谢,这正是我要找的。因此,在我键入该问题时,没有建议使用该链接。:)问题是
StreamReader
不是从
Stream
派生出来的。你应该展示这两者是如何相互作用的。@Scott,我假设OP已经有了一个文件流,但是你说得对,这里有些示例代码是合适的。