Jac*_*nes 0 c# foreach asynchronous file
当我遍历时,我的代码仅产生文本文件的第一行。
我对使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
我希望它能够读取所有内容,因为这应该是“ foreach(fileInfo中的var行)”的含义。谢谢大家的时间!非常感激!
您目前每迭代性格单一的内线上。如果要遍历文件中的每一行,则需要以下内容:
using (var reader = File.OpenText(path))
{
string line;
while ((line = await reader.ReadLineAsync()) != null)
{
// Use the line here
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,当前您是将每行追加到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)
{
...
}
Run Code Online (Sandbox Code Playgroud)
但是,如果文件很大,则在读取文件时显示进度可能不是您想要的。
| 归档时间: |
|
| 查看次数: |
143 次 |
| 最近记录: |