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

时间:2019-08-19 06:45:00

标签: c# file asynchronous foreach

我遍历代码时,它只会生成文本文件的第一行。

我对使用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行)”。谢谢大家的时间!非常感谢!

2 个答案:

答案 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();
        }