所以我没有做到的是,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;
}
答案 0 :(得分:53)
您可以将File.ReadLines
与Enumerable.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
}
}
}