查找一行 i 文本文件
本文关键字:文本 文件 一行 查找 | 更新日期: 2023-09-27 18:31:17
我需要一些帮助,我正在编写一个读取文本文件的方法,如果发生任何异常,我会在文本文件中附加一行。 例如"**"
所以我需要知道的是,如何在不读取文本文件的每一行(如 peek 方法或其他东西)的情况下检查文本文件中的特定文本行。
任何帮助将不胜感激。
提前谢谢。
您可以将File.ReadLines
与Any
结合使用:
bool isExcFile = System.IO.File.ReadLines(path).Any(l => l == "**");
ReadLines 和 ReadAllLines 方法的区别如下: 当您使用 ReadLines,您可以在之前开始枚举字符串的集合 返回整个集合;当您使用全部读取行时,您必须 等待返回整个字符串数组,然后才能访问 数组。因此,当您处理非常大的文件时, 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
}
}