我遍历代码时,它只会生成文本文件的第一行。
我对使用foreach循环很固执,但是我发现的一切都表明这应该可行。
public void Button3_Click(object sender, EventArgs e)
{
using (OpenFileDialog openFileDialog = new OpenFileDialog())
{
openFileDialog.InitialDirectory = "c:\\";
openFileDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
openFileDialog.FilterIndex = 2;
openFileDialog.RestoreDirectory = true;
DialogResult result = openFileDialog.ShowDialog();
path = openFileDialog.FileName;
//checkedTb.Text = fileInfo;
count = File.ReadLines(path).Count();
// checkedTb.Text = path;
}
}
public async void StartBtn_Click(object sender, EventArgs e)
{
StreamReader reader = new StreamReader(path);
fileInfo = await reader.ReadLineAsync();
foreach (var line in fileInfo)
{
checkedTb.Text += fileInfo;
}
}
我希望它能够读取所有内容,因为这就是 应该是“ foreach(fileInfo中的var行)”。谢谢大家的时间!非常感谢!
答案 0 :(得分:6)
当前,您正在迭代单个行中的每个字符。如果要遍历文件中的每个行,则需要以下内容:
using (var reader = File.OpenText(path))
{
string line;
while ((line = await reader.ReadLineAsync()) != null)
{
// Use the line here
}
}
请注意,当前您将每行追加到checkedTb.Text
,而没有换行符,因此最终将获得文件中的所有文本,但仅在一行中。如果这不是您想要的,则需要准确计算出您想要做的,以便进行适当的更改。
目前, 使用带有异步代码的foreach
循环(而不是while
循环)是棘手的,但是在C#8中将变得更加容易。返回IAsyncEnumerable<string>
,如果框架不提供它,您可能会编写自己。 (我希望在某个时候使用File.ReadLinesAsync
方法。)如果您乐意一次读取整个文件,则已经有了File.ReadAllLinesAsync
-返回Task<string[]>
。您可以将其用作:
var lines = await File.ReadAllLinesAsync(path);
foreach (var line in lines)
{
...
}
但是,如果文件很大,那么在读取文件时显示进度可能就不是您想要的。
答案 1 :(得分:0)
使用reader.ReadToEndAsync会更精确,您可以获得文件的所有内容,然后可以遍历每行
public static async void Click()
{
StreamReader reader = new StreamReader(@"D:\Bhushan\a.txt");
var fileContent = await reader.ReadToEndAsync();
}