#c# #streamreader #xmlreader
#c# #streamreader #xmlreader
Вопрос:
Я хотел бы повторно использовать 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-исключение. Нет ли способа эффективно «сбросить» StreamReader?
Спасибо,
Деннис
Ответ №1:
Вы не можете просто изменить позицию в BaseStream
, потому что StreamReader
выполняется буферизация данных из базового потока. Это просто испортит поведение StreamReader
, ничего хорошего из этого не выйдет.
Вы должны утилизировать старый StreamReader
и каждый раз создавать новый.
Комментарии:
1. Спасибо за ваш ответ, я боялся, что это будет так. Возможно, вы не знаете способ сделать это внутри веб-приложения ASP без излишнего раздувания кода?
2. @Деннис, не уверен, что ты имеешь в виду… Я не могу ответить на этот вопрос, не видя вашего кода
Ответ №2:
StreamReader
это не дорогой объект для создания, поэтому, пока базовый поток поддерживает установку позиции, вы должны просто создавать новый StreamReader
для него каждый раз.
Ответ №3:
Поскольку это буферизация, вам необходимо удалить буфер в дополнение к сбросу позиции.
sr.BaseStream.Position = 0;
sr.DiscardBufferedData();
Я сделал это, когда я хочу знать, сколько строк в файле, который я собираюсь проанализировать (1-й проход подсчитывает строки, 2-й проход анализирует и сохраняет результаты).
Ответ №4:
Вы пробовали добавить это в конец вашего метода?
reader.Close();
Возможно, ваш reader неправильно закрывается, что вызывает проблемы при следующем чтении.