2015-04-20 2 views
3

Я пытаюсь «обернуть» StreamReader в классе Fichier, с некоторыми дополнительными методами и атрибутами.Как проверить, открыт ли StreamReader?

Я хочу две вещи:

  • StreamReader открывается автоматически в Fichier классе;
  • StreamReader открывается, когда мы используем переопределенный метод ReadLine, а не раньше (мы должны изменить файл перед его чтением с помощью StreamReader).

кусок моего кода выглядит следующим образом:

public string ReadLine() 
{ 
    if (Reader == null || ???) 
    { 
     Reader = new StreamReader(Path); 
    } 
    return Reader.ReadLine(); 
} 

В ???, я хочу, чтобы проверить, если StreamReader был закрыт. Действительно, если мы делаем:

StreamReader sr = new StreamReader(path); 
sr.Close(); 

sr не равно нулю, но как проверить, что она закрыта, и как вновь открыть его?

Если вам интересно, почему мне нужно открывать и закрывать StreamReader, это связано с тем, что объект Fichier должен существовать в любое время, но файл, который он представляет, должен быть изменен несколько раз во внешней программе.

+3

«Система.В пространстве имен IO 'есть класс с именем' File', поэтому будьте осторожны, чтобы вы не смешивали свой собственный класс и ['System.IO.File'] (https://msdn.microsoft.com/en-us/library /system.io.file%28v=vs.110%29.aspx). – cubrr

+1

'.BaseStream.CanRead' возможно, хотя явное удаление/null было бы лучше. –

+0

Я французский, поэтому мой класс - «Фихье». Я отредактирую это, я хотел быть всеобъемлющим, но я сделал наоборот. – Chostakovitch

ответ

8

Проще всего это Dispose (вы действительно должны это сделать, он также закрывает поток) и установите его на null, когда вы его закроете.

Возможно, вы можете проверить наличие EndOfStream, но это требует, чтобы вы прочитали до конца потока.

+0

Хорошая идея; Спасибо. Почему я должен использовать 'Dispose' для' Close'? (в соответствии с этой темой 'Close' вызывает' Dispose': http://stackoverflow.com/questions/7524903/should-i-call-close-or-dispose-for-stream-objects) – Chostakovitch

+1

@Chostakovitch: Мнения различаются, но мое мнение таково: если он реализует 'IDisposable', вызовите' Dispose'. Это будущее доказательство, потому что, когда Microsoft обновляет его, и он требует удаления, тогда вы в безопасности. –

+0

Получил, спасибо. – Chostakovitch

2

Нет открытого способа проверить, закрыт ли поток/считыватель. Просто установите reader обнулить, как только вы закрыли:

Reader.Close(); 
reader = null; 

Или держать отдельный флаг.

+0

У меня не было, хотя к этому даже просто. Спасибо. – Chostakovitch

3

Просто установите ссылку на нуль при закрытии читателя:

sr.Close(); 
sr = null; 

Там нет никаких оснований, чтобы повесить на читателя поток, так как вы не можете открыть его. Вы должны создать новый, чтобы открыть читатель с открытым потоком.

2

StreamReader.Close() будет делать множество вещей, если leaveOpen флаг установлен в false, если это так, то вы можете проверить, если StreamReader.BaseStream является null.

var stream = File.OpenRead(@"C:\test.xml"); 

var streamReader = new StreamReader(stream); 
Console.WriteLine(streamReader.BaseStream == null); 

streamReader.Close(); 
Console.WriteLine(streamReader.BaseStream == null); 

выходы:

Ложные

Правда

Нажмите любую клавишу для продолжения. , ,

+0

Интересная идея. Я не думаю, что это поведение документировано, поэтому было бы лучше не полагаться на него. В самом деле, если кто-то не контролирует, когда читатель настроен, это может быть вариантом. Кроме того, использование свойства 'StreamReader' ограничивает возможности использования других читателей (т. Е. Base' TextReader'). –

Смежные вопросы