StreamReader не может прочитать с удаленного объекта

Я использую StreamReader, но если попытаться прочитать из того же потока, используя два StreamReaderЯ получаю сообщение об ошибке 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 ответа

Решение

Когда ты читаешь до конца reader2 вы действительно читаете до конца основного потока (responseStream2). В этот момент произойдет сбой другого чтения из этого потока.

В то время как конкретное исключение немного ожидаемо, один и тот же поток будет StreamReaders собирается делать странные вещи, потому что это странные вещи.

Если вам нужно прочитать поток дважды, вам нужно либо использовать поток, поддерживающий сброс его позиции в начало (т. Е. Произвольный доступ), а затем создать новый считыватель для второго чтения; или (как может показаться вероятным в этом случае: я сомневаюсь, что любой сетевой поток будет поддерживать произвольный доступ) буферизует содержимое потока самостоятельно.

Когда вы звоните ReadToEnd() основной пар все читается в память, и вы достигли конца.

Каждый раз, когда вы вызываете функцию ReadLine() Затем основной поток перемещается на следующую строку.

Это означает, что когда ваше приложение достигает Reader3.ReadLine() цикл, так как вы уже достигли конца файла, считыватель не может.

Если ожидаемый поток файлов не слишком велик, я бы посоветовал вам присвоить результат ReadToEnd() вызвать переменную и выполнить последующие операции с этой переменной.

Если поток большой, попробуйте сбросить Position свойство (при условии, что оно поддерживается - см. документы).

Другие вопросы по тегам