在CheckedItems的foreach循环中的StreamReader

时间:2012-03-14 20:18:14

标签: c# foreach streamreader

我有一个问题,我一直想弄清楚几个小时,我相信这很简单。

这是代码(删除了额外的垃圾,因为它不是问题)。

foreach (String itemChecked in fightsList.CheckedItems)
{
    try
    {
        Thread.Sleep(50);
        using (StreamReader reader = new StreamReader(new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), Encoding.ASCII))
            {
                while ((line = reader.ReadLine()) != null)
                    {
                        // do all stuff to lines here...
                    }
            }
    }
    catch (Exception error)
        {
            errorText.Text = error.ToString();
        }
}
// foreach done here.

我正在读取一个文本文件,显而易见的是StreamReader,但是当foreach循环滚动到第二次迭代时,它会在运行StreamReader之前失败并停止foreach循环。

第一个循环很好。

我认为这是一个问题,因为'StreamReader reader = new'已经存在且无法创建新的?

foreach是一个字符串checkedBox。 StreamReader正在为循环中的所有实例读取相同的文件,我只是处理每个开始和停止的位置。我的错误捕获没有得到任何东西,应用程序不会崩溃。

2 个答案:

答案 0 :(得分:2)

我认为你有一个逻辑问题,因为你不断尝试从循环中的每次迭代读取同一个文件(除非你从你的代码中删除了相关内容)。如果你想在每次循环后从同一个文件中读取,那么你应该只需要在外部for循环之外创建一次流读取器。此外,由于您没有关闭文件,因此在第一次迭代后可能会遇到文件末尾的问题。这可以解释为什么它只能在第一次工作

答案 1 :(得分:0)

问题不在您发布的代码中。我建议将文件流分配为一个单独的步骤,并在您将其传递到StreamReader的行上放置一个断点。在第二遍确保所有内容(文件名,长度等)在底层流上看起来没问题,问题在循环内部,否则它在代码中的其他地方。

您最好重新组织代码,例如

using(StreamReader reader = new StreamReader(new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), Encoding.ASCII)){
    while ((line = reader.ReadLine()) != null)
    {
        foreach (String itemChecked in fightsList.CheckedItems)
       {
       }
    }
}

因为这会使昂贵的操作(文件IO)尽可能少地发生,但这不是你遇到这个特定问题的原因。