Сброс StreamReader для нескольких использований XmlReader.Read () - PullRequest
4 голосов
/ 19 апреля 2011

Я хотел бы повторно использовать StreamReader, который я связал с XML-файлом для .Read () - вызовы из System.Xml.XmlReader.

В основном я собрал небольшое расширениеметод со следующим кодом:

 public static string GetValueByPath(this StreamReader str, string attributeName, params string[] nodes)
    {
        str.BaseStream.Position = 0;
        XmlReader reader = XmlReader.Create(str);
        // Stuff happens here now, not important for the question
    }

StreamReader, вызывающий этот метод расширения, остается неизменным на протяжении всей сессии.

В первый раз это работает просто отлично, но если я использую этот методвторой раз я получаю System.Xml-Exception.Нет ли способа эффективно «сбросить» StreamReader?

Спасибо,

Деннис

Ответы [ 4 ]

5 голосов
/ 19 апреля 2011

Вы не можете просто изменить позицию в BaseStream, потому что StreamReader буферизует данные из базового потока.Он просто испортит поведение StreamReader, ничего хорошего из этого не выйдет.

Вы должны утилизировать старый StreamReader и каждый раз вместо него создавать новый.

2 голосов
/ 19 апреля 2011

StreamReader не является дорогим объектом для создания, поэтому, если базовый поток поддерживает настройку позиции, вам нужно просто каждый раз создавать новый StreamReader.

0 голосов
/ 04 ноября 2015

Поскольку это буферизация, вам нужно сбросить буфер в дополнение к сбросу позиции.

            sr.BaseStream.Position = 0;
            sr.DiscardBufferedData();

Я сделал это, когда хочу узнать, сколько строк в файле, о котором ядля анализа (1-й проход считает строки, 2-й проход анализирует и сохраняет результаты).

0 голосов
/ 19 апреля 2011

Вы пытались добавить это в конец метода?

reader.Close();

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

...