查找一行 i 文本文件

本文关键字:文本 文件 一行 查找 | 更新日期: 2023-09-27 18:31:17

我需要一些帮助,我正在编写一个读取文本文件的方法,如果发生任何异常,我会在文本文件中附加一行。 例如"**"

所以我需要知道的是,如何在不读取文本文件的每一行(如 peek 方法或其他东西)的情况下检查文本文件中的特定文本行。

任何帮助将不胜感激。

提前谢谢。

查找一行 i 文本文件

您可以将File.ReadLinesAny结合使用:

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
    }
}