Soru Bir StreamReader'ı temel akışı akıtmadan tutabilir misiniz?


Bunu yapmanın bir yolu var mı?

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...
}

Dosyayı iki kez açmak zorunda kalmadan mı?

StreamReader’ı akışımma atmayacak gibi görünmüyorum. Ben de kapsam dışına çıkmasına izin vermek istemiyorum. Daha sonra çöp toplayıcı, sonunda Dispose'ı çağırır ve akışı öldürür.


44
2017-12-07 19:19


Menşei




Cevaplar:


Ben de kapsam dışına çıkmasına izin vermek istemiyorum. Daha sonra çöp toplayıcı, sonunda Dispose'ı çağırır ve akışı öldürür.

Çöp toplayıcı arayacak Finalize yöntem (yok edici), değil Dispose yöntem. Finalizer arayacak Dispose(false) hangi olacak değil Alttaki akışı atın. Tamam bırakarak iyi olmalısın StreamReader Temel akışı doğrudan kullanmanız gerekiyorsa kapsam dışı kalın. Uygun olduğunda, temel akışı manuel olarak elinize aldığınızdan emin olun.


43
2017-12-07 19:24





.NET 4.5 bu sorunu nihayet StreamOkucu ve StreamWriter üzerinde bir bırakıcı parametresi alan yeni kurucularla düzeltir:

StreamReader(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize, bool leaveOpen)

StreamWriter(Stream stream, System.Text.Encoding encoding, int bufferSize, bool leaveOpen)

61
2017-11-04 00:27



Bununla ilgili problem, StreamReader'ın onu kullanarak açtığımda yaptığım gibi davranmasını sağlamak için hangi kodlamanın geçtiğini bulmama zorlamasıdır. StreamReader(Stream) Yapıcı. Bu yüzden hala "kullanma arkadaşlarımın hiçbiri kullanma ve kullanma" yöntemini kullanarak "StreamReader'ı kullanarak bir blok oluştur" yöntemini kullanıyorum. - phoog
@phoog: (gelen kutuma yetişiyor) - MSDN, örneğin yönlendirme stili aşırı yüklemeler için varsayılanları listelemeli StreamReader(Stream) "Bu kurucu, kodlamayı UTF8Encoding, stream parametresini kullanarak BaseStream özelliğini ve dahili arabellek boyutunu 1024 bayt olarak başlatır." - Simon Buchan
@SimonBuchan Ama bu varsayılanları programımda kodlamamalıyım. StreamReader() kurucu, nasıl bir seçenek stili sınıf parametresi almak için değiştirilmiş olmalıdır, nasıl XmlReaderSettingsEserleri. Daha sonra varsayılanlar, ABI olmayan ve sert olmayan bir şekilde eklenen çerçeve ve yeni parametreler tarafından yönetilebilir. - binki
@binki Ya da sadece bir kurucu Stream ve bir bool = / Nevermind, görüyorum ki bu imzayla zaten bir kurucu var. İç çekmek. - crush
kullanarak (var okuyucu = StreamReader (OtherStream, System.Text.Encoding.UTF8, 1024, true)) varsayılan değerlere bağlı kalmak istiyorsanız {...}. yorum taşındı - TamusJRoyce


Kullanabilirsiniz NonClosingStreamWrapper Jon Skeet'in dersi MiscUtil kütüphanesitam olarak bu amaca hizmet ediyor


15
2017-12-07 19:28





StreamReader'dan miras kalan ve Kapat yöntemini geçersiz kılan yeni bir sınıf oluşturabilirsiniz. Kapat yönteminizin içinde, Mehrdad'ın işaret ettiği gibi, Akışı (yanlış) çağırın, akışı kapatmaz. Aynısı StreamWriter için de geçerlidir.

Bununla birlikte, daha iyi bir çözüm, StreamReader ve StreamWriter örneklerine ihtiyaç duyduğunuz sürece sahip olmak gibi görünüyor. Akışı açık tutmayı planlıyorsanız, bir StreamReader ve StreamWriter'i de açık tutabilirsiniz. StreamWriter.Flush ve Stream.Seek'i doğru kullanırsanız, bu çalışmayı hem okuma hem de yazma sırasında bile yapabilmeniz gerekir.


3
2017-12-07 19:43





Sadece kullanarak-Blok kaldır. Akışı Dispose () yapmak istemiyorsanız StreamReader'ı Dispose () 'a bırakmak zorunda değilsiniz.


2
2017-12-07 19:22



Ama gelecekte böyle bir ihtimal yok. StreamReader bazı yönetilmeyen kaynakları tutmak için değiştirilecek, bir finalizer uygulanmaya başlayacak ve sonra çöp toplayıcı onu sonlandırmak zaman akışınızı rastgele kapattığınızda akışınızı kapattığınızda? Ya da biz sözde Bunu varsaymak, çünkü şimdi olmaz, asla olmaz mı? - binki


"True" için "leaveOpen" parametresini belirtebileceğiniz başka bir kurucu aşırı yükü kullanın


1
2018-04-10 14:00





Kendinizi bir try/finally işin bittiğinde.

var sr = new StreamReader();
try {
    //...code that uses sr
    //....etc
}
finally
{
    sr.Close();
}

0
2017-12-07 19:22





Ben her zaman böyle bir şey kullanırım: (aynı zamanda leaveOpen argüman)

public static class StreamreaderExtensions
{
    public static StreamReader WrapInNonClosingStreamReader(this Stream file) => new StreamReader(file, Encoding.UTF8, true, 1024, true);
}

Kullanımı:

using (var reader = file.WrapInNonClosingStreamReader())
{
     ....
}

0
2018-01-24 08:51