Im trying to prompt a downloadable text file (.txt), but I get this error:
Cannot access a closed Stream.
I have looked at simular questions in here:
Cannot Access Closed Stream
But it was not very useful.
Here is my code:
private FileStreamResult Export()
{
string name = "filename.txt";
MemoryStream stream = new MemoryStream();
using (StreamWriter writer = new StreamWriter(stream))
{
StringBuilder sb = new StringBuilder();
sb.Append("A text...");
writer.WriteLine(sb.ToString());
}
return File(stream, "text/plain", name);
}
UPDATE (working copy):
This gives me an blank text file.
private FileResult Export()
{
string name = "filename.txt";
MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
StringBuilder sb = new StringBuilder();
sb.Append("A text...");
writer.WriteLine(sb.ToString());
writer.Flush();
stream.Seek(0, SeekOrigin.Begin);
return File(stream, "text/plain", name);
}
That is correct, when you wrap a stream in another stream, calling
.Close()or.Dispose()on any of them will dispose the whole stream. In this case, wrapping theMemoryStreamin aStreamWritermeans that when theusingstatement completes theStreamWriterandMemoryStreamare both disposed.My guess is since you are returning a
FileStreamResultthe encapsulatingFilewill close the stream for you after the stream is no longer used. In this case, you do not want to use theusingstatement and will want to leave the stream open when returning it.UPDATE
Since a stream is forward access you’ll need to see the stream back to the beginning to allow the data to be read back out.