[英]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.ReadLines
与Enumerable.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.