我需要一些帮助,我正在编写一个读取文本文件的方法,如果发生任何异常,我会在文本文件中附加一行。例如“ ** ”
所以我需要知道的是如何在不读取文本文件的每一行的情况下检查文本文件中的特定文本行,比如 peek 方法或其他东西。
任何帮助,将不胜感激。
提前致谢。
我需要一些帮助,我正在编写一个读取文本文件的方法,如果发生任何异常,我会在文本文件中附加一行。例如“ ** ”
所以我需要知道的是如何在不读取文本文件的每一行的情况下检查文本文件中的特定文本行,比如 peek 方法或其他东西。
任何帮助,将不胜感激。
提前致谢。
您可以File.ReadLines
结合使用Any
:
bool isExcFile = System.IO.File.ReadLines(path).Any(l => l == "**");
ReadLines 和 ReadAllLines 方法的区别如下: 使用 ReadLines 时,可以在返回整个集合之前开始枚举字符串集合;使用 ReadAllLines 时,必须等待返回整个字符串数组才能访问该数组。因此,当您处理非常大的文件时,ReadLines 会更有效率。
我找到了一个解决方案,我附加到文件的行将始终是文件中的最后一行,所以我创建了一个读取最后一行的方法。见下文:
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 ;
}
您将需要维护一个单独的文件,其中包含特殊标记所在位置的索引(例如逗号分隔)。然后您只能读取这些索引并使用Seek方法跳转到文件流中的那个点。
如果您的文件相对较小,假设 <50MB 这是一个矫枉过正。不仅如此,您还可以考虑维护索引文件。您基本上必须权衡额外 IO 调用(即读取索引文件)的性能与仅从文件流中读取每一行的性能。
据我了解,您想要处理一些文件,并在处理后找出哪些文件包含“**”符号,而无需读取文件的每一行。
如果您将“**”附加到文件末尾,您可以执行以下操作:
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
}
}