Можете ли вы сохранить StreamReader от использования базового потока?
Есть ли способ сделать это:
this.logFile = File.Open("what_r_u_doing.log", FileMode.OpenOrCreate, FileAccess.ReadWrite);
using(var sr = new StreamReader(this.logFile))
{
// Read the data in
}
// ... later on in the class ...
this.logFile = File.Open("what_r_u_doing.log", FileMode.OpenOrCreate, FileAccess.ReadWrite);
using(var sw = new StreamWriter(this.logFile))
{
// Write additional data out...
}
Без необходимости дважды открывать файл?
Я не могу заставить StreamReader не удалять мой поток. Я не хочу просто выходить из сферы действия. Затем сборщик мусора в конечном итоге вызовет Dispose, убив поток.
Ответы
Ответ 1
Я не хочу просто выходить из сферы действия. Затем сборщик мусора в конечном итоге вызовет Dispose, убив поток.
Сборщик мусора вызовет метод Finalize
(деструктор), а не метод Dispose
. Финализатор вызовет Dispose(false)
, который будет не распоряжаться базовым потоком. Вы должны быть в порядке, оставив StreamReader
выйти из области действия, если вам нужно напрямую использовать базовый поток. Просто убедитесь, что вы располагаете базовый поток вручную, когда это необходимо.
Ответ 2
.NET 4.5 окончательно устранит эту проблему с помощью новых конструкторов StreamReader и StreamWriter, которые принимают параметр leaveOpen:
StreamReader(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize, bool leaveOpen)
StreamWriter(Stream stream, System.Text.Encoding encoding, int bufferSize, bool leaveOpen)
Ответ 3
Вы можете использовать класс NonClosingStreamWrapper
от Jon Skeet библиотека MiscUtil, он служит именно в этой цели
Ответ 4
Вы можете создать новый класс, который наследует от StreamReader и переопределяет метод Close; внутри метода Close вызовите Dispose (false), который, как указал Мехрдад, не закрывает поток. То же самое относится и к StreamWriter.
Однако кажется, что лучшим решением было бы просто удерживать экземпляры StreamReader и StreamWriter, если они вам понадобятся. Если вы уже планируете поддерживать поток открытым, вы можете также открыть StreamReader и StreamWriter. Если вы правильно используете StreamWriter.Flush и Stream.Seek, вы сможете выполнять эту работу даже при чтении и записи.
Ответ 5
Просто удалите используемый блок. Вам не нужно Dispose() StreamReader, если вы не хотите использовать Dispose() поток, я думаю.
Ответ 6
Используйте другую перегрузку конструктора, где вы можете указать параметр "leaveOpen" на "true"
Ответ 7
Закройте его в предложении try
/finally
, когда вы закончите с ним.
var sr = new StreamReader();
try {
//...code that uses sr
//....etc
}
finally
{
sr.Close();
}