56 votes

Pouvez-vous empêcher un StreamReader de supprimer le flux sous-jacent?

Y a-t-il un moyen de faire cela:

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

Sans avoir à ouvrir le fichier deux fois?

Je n'arrive pas à empêcher le StreamReader de supprimer mon flux. Je ne veux pas non plus le laisser sortir du cadre. Ensuite, le garbage collector finira par appeler le Dispose, tuant le flux.

78voto

Simon Buchan Points 6245

.NET 4.5 va enfin résoudre ce problème avec de nouveaux constructeurs sur StreamReader et StreamWriter qui prennent un paramètre LeaveOpen:

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

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

52voto

Mehrdad Afshari Points 204872

Je ne veux pas juste le laisser aller hors de portée, non plus. Alors que le garbage collector appellera éventuellement les Éliminer, de tuer les flux.

Garbage collector qui fera appel à la Finalize méthode (destructeur), pas le Dispose méthode. Le finaliseur appellera Dispose(false) qui va pas jeter le flux sous-jacent. Vous devriez être OK en laissant l' StreamReader hors de portée si vous avez besoin d'utiliser le flux sous-jacent directement. Juste assurez-vous de jeter le flux sous-jacent à la main quand c'est approprié.

16voto

Thomas Levesque Points 141081

Vous pouvez utiliser la classe NonClosingStreamWrapper de la bibliothèque MiscUtil de Jon Skeet, elle sert exactement ce but

4voto

Rubens Farias Points 33357

Vous devez supprimer ce descripteur de fichier dès que possible, même si vous devez le rouvrir plus tard, comme vous le feriez probablement avec votre connexion à la base de données.

Si vous ne voulez pas que votre fichier soit traité, vous devez supprimer votre using .

2voto

eWolf Points 1693

Retirez simplement le bloc d'utilisation. Vous n'avez pas à Dispose () le StreamReader si vous ne voulez pas faire Dispose () le stream, je pense.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X