comme Discuté avant , lorsqu'un binaryReader ou un binarywriter est fermé, son flux sous-jacent se fermait également (Aargh). Considérez cette situation: une routine r code> est passée à une mémoire MemorMODream, disons
m code>; Je voudrais écrire des choses à
M code>, puis transmettez-la à une autre routine pour plus de traitement (pas nécessairement d'écrire). Pour la commodité, j'aimerais envelopper
M code> dans un binarywriter pour faire mon écriture. Après écrit, j'ai fini avec le binarywriter mais pas avec
m code>.
void R(MemoryStream M)
{
using (B = new BinaryWriter(M))
{
// write some stuff using B
}
S(M); // now pass M to another routine for further processing
}
7 Réponses :
Une approche quelque peu naïve consiste à utiliser pour copier le contenu du flux sur un tableau d'octets. Vous pouvez le retourner dans un flux avec P> MemoryStream ms = new MemoryStream(buf);
Mise à la peine d'être soulignée: cette méthode fonctionne sur un flux fermé ainsi que sur une.
Vous pouvez: p>
Vous ne pouvez pas simplement éviter d'appeler fermer / éliminer?
Accorde à Ce m.clone (); devrait marcher. Mais je me trompe peut-être ... P>
-1 pour la publication sur un site Web qui ne permet pas de visionner son contenu gratuitement, qui est à peu près inutile
Vous devriez mieux obtenir le tampon d'octet sous-jacent [] à l'aide de , puis copiez les données d'octets à l'aide de la méthode Array.copy ().
Vous êtes libre de créer un nouveau flux avec elle. P> p>
Je ne comprends pas pourquoi vous dites qu'il est préférable d'utiliser GetBuffer, puis de faire une copie à l'aide de Tary.copy. Si je voulais une copie, je n'utiliserais que de Toarray.
De MSDN DOC, cette méthode omet des octets inutilisés dans MemorMemstream de la matrice. Pour obtenir le tampon entier, utilisez la méthode GetBuffer. msdn.microsoft.com/en-us/Library/ ...
La "Cette méthode" ci-dessus fait référence à la mémoire MemorMem.Tearray ()
Grâce à plusieurs personnes qui ont suggéré de cochary, on m'a conduit à une bonne réponse, ce qui est «m.getbuffer». Toarray n'est pas trop mauvais, mais il p>
GetBuffer prend juste une référence à l'octet sous-jacent [], qui est ce que je suis après. p>
Vous pouvez utiliser des choses comme le Miscuil.io.nonclosingStreamwrapper code> dans MISCUTIL , qui enveloppe un flux code> Ignore simplement
Fermer code> /
Dispose code> Demandes. Pour juste cet objectif.
void R(MemoryStream M)
{
using (B = new BinaryWriter(new NonClosingStreamWrapper(M)))
{
// write some stuff using B
}
S(M); // now pass M to another routine for further processing
}
Juste pour l'ajouter ici, une solution très simple serait void R(MemoryStream M)
{
B = new BinaryWriter(M);
// write some stuff using B
B.Flush();
S(M); // now pass M to another routine for further processing
}
Mais assurez-vous d'appeler b.flush () après avoir terminé avec cela au cas où il n'a pas tout poussé à M. (c'est ce qui serait nécessaire à Java, aucune idée de C #)
Ok, Adrian & Marc, j'ai oublié de chasser ().
Je ne sais pas C #, mais à Java, vous venez d'abandonner simplement sans fermer le binarywriter. L'utilisation de {...} ne ferme pas la fermeture de la force? Ensuite, n'utilisez pas cette construction!
P.s. Mais vous devez vous assurer de vous assurer de chasser le binarywriter avant de l'abandonner.