Подтвердить что ты не робот

Можете ли вы сохранить 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, убив поток.

4b9b3361

Ответ 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();
}