我想在40-50个长文件中找到一个特定的字符串。为此,我使用了以下代码: -
foreach(StreamReader SR in FileList)
{
// Process the file
}
// File List contains initialized instances of StreamReader class
这样做我收到了
null reference exception
虽然,当
FileList
只包含1个元素,代码工作正常。可能的原因是什么以及如何纠正? 我已经创建了这样的函数,它初始化文件并将它们添加到FileList:
public static void Initialize()
{
StreamReader File1 = new StreamReader("some valid path here",false, Encoding.UTF8) ;
FileList.Add(File1) ;
// Similarly for other files.
}
foreach循环中的代码是: -
foreach( StreamReader SR in FileList)
{
while (!SR.EndOfStream)
{
Content = SR.ReadLine() ;
if(Content.Contains(Name))
{
Console.WriteLine("Found");
}
}
}
// Content and Name are other string variable declared previously in the program
正如有些人指出错误可能是由变量内容引起的,我想澄清一下情况并非如此。
答案 0 :(得分:1)
可以通过,因为FileList为null并且不包含任何元素。当然这会引发异常。 在调用foreach之前,您应该检查它是否为null。 ..或者只是使用new之前在某处创建FileList,以填充它。
答案 1 :(得分:1)
检查您的Content
变量是否为null,因为如果SR.EndOfStream
为空且未读取,SR
可能未正确设置。
如果可能,FileList
中有空条目,请将SR
检查为空。
foreach( StreamReader SR in FileList)
{
if(SR == null) continue;
while (!SR.EndOfStream)
{
Content = SR.ReadLine() ;
if(Content != null && Content.Contains(Name))
{
Console.WriteLine("Found");
}
}
}
答案 2 :(得分:1)
来自StreamReader
输入流的下一行,如果到达输入流的末尾,则为null。
所以你正在阅读传递流的末尾,将内容设置为null。
你应该改变你的循环逻辑
while ((Content = SR.ReadLine()) != null)
{
if (Content.Contains(Name))
{
Console.WriteLine("Found");
}
}
但是我建议这样做不同
var paths = //set to a list of file paths
var findings = from path in paths
from line in System.IO.File.ReadAllLines(path)
where line.Contains(name)
select line
这将为您提供包含名称
中的字符串的所有行答案 3 :(得分:1)
有一个非常好用且安全的方法File.ReadLines(不要与File.ReadAllLines混淆)
它不会读取文件的整个内容,但每次调用都会加载一行
foreach (string path in paths)
{
foreach (string line in File.ReadLines(path))
{
if (line.Contains(Name))
{
Console.WriteLine("found");
break;
}
}
}