“ foreach(fileInfo中的var行)”仅读取第一行

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行)”的含义。谢谢大家的时间!非常感激!

Jon*_*eet 6

您目前每迭代性格单一的内线上。如果要遍历文件中的每一,则需要以下内容:

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)

但是,如果文件很大,则在读取文件时显示进度可能不是您想要的。