c# - guardar - Escribir en MemoryStream con StreamWriter devuelve vacío
memorystream from file c# (3)
Como no está utilizando "using" o streamWriter.Flush (), el escritor no confirmó cambios en la transmisión. Como resultado Stream itslef no tiene datos aún. En general, desea envolver la manipulación con las instancias de Stream y StremaWriter usando.
También debe considerar devolver una nueva instancia de MemoryStream:
using(var memStream = new MemoryStream())
{
....
return new MemoryStream(memStream.ToArray(), false /*writable*/);
}
No estoy seguro de lo que estoy haciendo mal, he visto muchos ejemplos, pero parece que no puedo hacer que esto funcione.
public static Stream Foo()
{
var memStream = new MemoryStream();
var streamWriter = new StreamWriter(memStream);
for (int i = 0; i < 6; i++)
streamWriter.WriteLine("TEST");
memStream.Seek(0, SeekOrigin.Begin);
return memStream;
}
Estoy haciendo una prueba simple de este método para intentar que pase, pero no importa qué, el recuento de mi colección es 0.
[Test]
public void TestStreamRowCount()
{
var stream = Foo();
using (var reader = new StreamReader(stream))
{
var collection = new List<string>();
string input;
while ((input = reader.ReadLine()) != null)
collection.Add(input);
Assert.AreEqual(6, collection.Count);
}
}
Nota: Cambié la sintaxis anterior sin compilar en el método de prueba. Lo que es más importante es el primer método que parece devolver una secuencia vacía (my reader.ReadLine () siempre se lee una vez). No estoy seguro de lo que estoy haciendo mal. Gracias.
Intenta enjuagar streamWriter después de escribir tus líneas.
Te estás olvidando de vaciar tu instancia de StreamWriter
.
public static Stream Foo()
{
var memStream = new MemoryStream();
var streamWriter = new StreamWriter(memStream);
for (int i = 0; i < 6; i++)
streamWriter.WriteLine("TEST");
streamWriter.Flush(); <-- need this
memStream.Seek(0, SeekOrigin.Begin);
return memStream;
}
También tenga en cuenta que StreamWriter
debe eliminarse, ya que implementa IDisposable
, pero que a su vez genera otro problema, también cerrará el MemoryStream
subyacente.
¿Estás seguro de que quieres devolver un MemoryStream
aquí?
Yo cambiaría el código a esto:
public static byte[] Foo()
{
using (var memStream = new MemoryStream())
using (var streamWriter = new StreamWriter(memStream))
{
for (int i = 0; i < 6; i++)
streamWriter.WriteLine("TEST");
streamWriter.Flush();
return memStream.ToArray();
}
}
[Test]
public void TestStreamRowCount()
{
var bytes = Foo();
using (var stream = new MemoryStream(bytes))
using (var reader = new StreamReader(stream))
{
var collection = new List<string>();
string input;
while ((input = reader.ReadLine()) != null)
collection.Add(input);
Assert.AreEqual(6, collection.Count);
}
}