只读文本文件的第一行

时间:2014-12-07 17:57:33

标签: c#

所以我没有做到的是,MyFile.txt在第一行有“英语”,“法语”或“德语” 我想从文本文件的第一行获取语言,然后继续我的代码

String[] languages = new String[] { "english", "french", "german"};

foreach (String language in languages)
{
    string line1 = File.ReadLines("MyFile.txt").Skip(0).Take(1);
    line1 = language;
    continue;
}

4 个答案:

答案 0 :(得分:53)

您可以将File.ReadLinesEnumerable.First一起使用。 这保证您只读取文件中的第一行。

using System.Linq; 

...

string line1 = File.ReadLines("MyFile.txt").First(); // gets the first line from file.

File.ReadAllLines的区别在于,File.ReadLines使用延迟评估,并且首先不会将wole文件读入行数组。

修改: Linq还确保正确处理FileStream。

答案 1 :(得分:43)

在OP对 CSharpie 的答案的评论中评论ReadAllLines()的用法;如果MyFile.txt是一个非常大的文件,它可能会对性能产生巨大影响。

File.ReadAllLines().First()实际上会读取所有行,将它们存储在string[]中然后取第一行。因此,如果您的文件非常大,它会将所有这些行存储在数组中,这可能需要一些时间。

另一种更好的表现选择是打开StreamReader并只读取第一行。正确的实施将是;

String[] languages = new String[] { "english", "french", "german"};
string firstLine;

using(StreamReader reader = new StreamReader("MyFile.txt"))
{
    firstLine = reader.ReadLine() ?? "";
}

if(languages.Contains(firstLine))
{
    //...
}

using的使用将负责关闭和处理读者。此外,使用??将确保永远不会返回null(从而在ArgumentNullException上为您节省Contains()

答案 2 :(得分:4)

虽然帖子是从2014年开始的,但使用更新方法的更有效的解决方案可能就是这个:

System.IO.StreamReader readingFile = new System.IO.StreamReader(filePath);

string readingLine = readingFile.ReadLine();

通过这种方式,您可以防止读取多行,并且需要使用Linq获取第一行。

答案 3 :(得分:0)

如果文件已被另一个进程打开并且允许并发读取,则需要这样的操作。否则会引发共享冲突异常。

using (var fileStream = new FileStream(@"MyFile.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
    using (var readerForFileStream = new StreamReader(fileStream))
    {
        string firstLine = readerForFileStream.ReadLine();

        if (firstLine != null)
        {
            // the file has a line
        }
    }
}