StreamReader无法从已处置的对象中读取

时间:2013-02-25 11:42:49

标签: c# streamreader

我正在使用StreamReader,但如果尝试使用两个StreamReader - 对象从同一个流中读取,我会收到错误消息{I} can't read from dispose object (reader3.ReadLine)。 由于我没有处理任何物体,我做错了什么?

Stream responseStream2;
FtpWebResponse ftpResponse2;

string casefile = CNCElement.ID_CASE_TEST_FILE;
string casepath;
if (FileManager.PathCombine(result, lock_root_folder, casefile, out casepath) == false)
    return false;
if (fm.DownloadFtp(result, casepath, out responseStream2, out ftpResponse2) == false)
    return false;

StreamReader reader2 = new StreamReader(responseStream2);
StreamReader reader3 = new StreamReader(responseStream2);
byte[] contents=null;
//if cycle is not present update case file
//if cycle is present, case file is already correct
if (reader2.ReadToEnd().Contains(cycle) == false)
{
    byte seekcase = CNCElement.ID_CASE.Value;
    int casecount = 1;
    string line;
    using (MemoryStream ms = new MemoryStream())
    {
        while ((line = reader3.ReadLine()) != null
              || casecount <= seekcase)
        {
            if (line.Contains("\"\"") == true)
            {
                if (casecount == seekcase)
                    line = line.Replace("\"\"", "\"" + cycle + "\"");
            }
            byte[] app = StrToByteArray(line);
            ms.Write(app, 0, line.Length);
            contents = ms.ToArray();
        }
    }
}

if (reader2 != null)
    reader2.Close();
if (ftpResponse2 != null)
    ftpResponse2.Close();

2 个答案:

答案 0 :(得分:3)

当您致电ReadToEnd()时,基础蒸汽全部被读入内存并且您已到达终点。

每次调用函数ReadLine()时,基础流都会移动到下一行。

这意味着当您的应用程序到达Reader3.ReadLine()循环时,由于您已经到达文件末尾,读取器将失败。

如果预期的文件流不是太大,我建议您将ReadToEnd()调用的结果分配给变量,并对此变量执行后续操作。

如果流量较大,请尝试重置Position属性(前提是支持 - See the docs)。

答案 1 :(得分:3)

当你读到reader2的末尾时,你实际上正在读到底层流的末尾(responseStream2)。此时,该流的另一次读取将失败。

虽然稍微预期了特定的异常,但在不同的StreamReaders中包装相同的流会产生奇怪的事情,因为这是一件很奇怪的事情。

如果您需要两次读取流,则需要使用支持将其位置重置为开头的流(即随机访问),然后为第二次读取创建新的读取器;或者(在这种情况下似乎很可能:我怀疑任何网络流都支持随机访问)自己缓冲流内容。