我需要一些帮助,我正在编写一个读取文本文件的方法,如果发生任何异常,我会在文本文件中附加一行。例如“ ** ”
所以我需要知道的是如何在不读取文本文件的每一行的情况下检查文本文件中的特定文本行,如窥视方法或其他内容。
任何帮助都将不胜感激。
提前致谢。
答案 0 :(得分:2)
您可以将File.ReadLines
与Any
结合使用:
bool isExcFile = System.IO.File.ReadLines(path).Any(l => l == "**");
ReadLines和ReadAllLines方法的不同之处如下:使用时 ReadLines,您可以先开始枚举字符串集合 整个系列归还;当你使用ReadAllLines时,你必须 在您可以访问之前等待返回整个字符串数组 数组。因此,当您使用非常大的文件时, ReadLines可以更有效率。
答案 1 :(得分:1)
我找到了一个解决方案,我附加到文件的行总是文件的最后一行,所以我创建了一个方法来读取最后一行。见下文:
public string ReadLastLine(string path)
{
string returnValue = "";
FileStream fs = new FileStream(path, FileMode.Open);
for (long pos = fs.Length - 2; pos > 0; --pos)
{
fs.Seek(pos, SeekOrigin.Begin);
StreamReader ts = new StreamReader(fs);
returnValue = ts.ReadToEnd();
int eol = returnValue .IndexOf("\n");
if (eol >= 0)
{
fs.Close();
return returnValue .Substring(eol + 1);
}
}
fs.Close();
return returnValue ;
}
答案 2 :(得分:0)
您需要维护一个单独的文件,其中包含特殊标记所在的索引(例如逗号分隔)。然后,您只能读取这些索引并使用Seek方法跳转到文件流中的该点。
如果您的文件相对较小,那么请说< 50MB这是一种过度杀伤力。除此之外,您可以考虑维护索引文件。您基本上必须权衡额外IO调用(即读取索引文件)的性能与从每行的文件流中读取的性能。
答案 3 :(得分:0)
根据我的理解,您希望处理一些文件,并在处理后找出哪些文件包含“**”符号,而不读取文件的每一行。
如果您将“**”附加到文件末尾,则可以执行以下操作:
using (StreamReader sr = new StreamReader(File.OpenText(fileName)))
{
sr.BaseStream.Seek(-3, SeekOrigin.End);
string endToken = sr.ReadToEnd();
if (endToken == "**\n")
{
// if needed, go back to start of file:
sr.BaseStream.Seek(0, SeekOrigin.Begin);
// do something with the file
}
}