如何在C#中从头到尾读取非常大的文件?
我有一个4.5GB大小的文本文件,它是由一个实验应用程序创建的。在我的8GB RAM系统上,无法打开此文件(尝试使用升华文本)。我只想从头到尾读取此文件的内容,比如说从头到尾读取45个字符,而不将整个文件加载到内存中。如何做到这一点? 内在的方法,比如如何在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
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已经有了一个文件流,但是你说得对,这里有些示例代码是合适的。