繁体   English   中英

只读取文本文件的第一行

[英]Read only first line from a text file

所以我没有做的是,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;
}

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

using System.Linq; 

...

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

File.ReadAllLines的不同之处在于, File.ReadLines使用惰性求值,而不是先将整个文件读入行数组。

Linq 还确保正确处理 FileStream。

在 OP 对CSharpie答案的评论中评论ReadAllLines 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 on Contains() )。

虽然这篇文章是 2014 年的,但使用更新方法的更有效的解决方案可能是这个:

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

string readingLine = readingFile.ReadLine();

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

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

// Usage of "FileAccess.Read, FileShare.ReadWrite" prevents an avoidable
// exception when file is already opened with concurrent reading by 
// another process
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
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM