而在ASP创建一个可下载的文本文件MVC 3无法访问已关闭的流 [英] Cannot access a closed Stream while creating a downloadable text file in ASP MVC 3

查看:512
本文介绍了而在ASP创建一个可下载的文本文件MVC 3无法访问已关闭的流的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试着去提示下载的文本文件(.txt),但我得到这个错误:


  

无法访问已关闭的流。


我已经看过这里simular问题:
无法访问关闭的流
但它不是非常有用的。

下面是我的code:

 私人FileStreamResult导出()
    {
        字符串名称=FILENAME.TXT;        MemoryStream的流=新的MemoryStream();
        使用(StreamWriter的作家=新的StreamWriter(流))
        {
            StringBuilder的SB =新的StringBuilder();
            sb.Append(一文......);
            writer.WriteLine(sb.ToString());
        }        返回文件(流,text / plain的名);
    }

UPDATE(工作副本):

这给了我一个空白的文本文件。

 私人FileResult导出()
{
    字符串名称=FILENAME.TXT;    MemoryStream的流=新的MemoryStream();
    StreamWriter的作家=新的StreamWriter(流);    StringBuilder的SB =新的StringBuilder();
    sb.Append(一文......);
    writer.WriteLine(sb.ToString());    writer.Flush();
    stream.Seek(0,SeekOrigin.Begin);    返回文件(流,text / plain的名);
}


解决方案

这是正确的,当你在另一个流包流,称 .Close() .Dispose()上的任何人会处理整个流。在这种情况下,包裹的MemoryStream 的StreamWriter 表示,当使用语句完成的的StreamWriter 的MemoryStream 都配置。

我的猜测是因为在返回 FileStreamResult 封装文件流后会关闭流为你不再使用。在这种情况下,你不希望使用使用语句和将要返回时,离开流开。

更新

由于流是正向的访问,你需要看到流回到开头,以允许回读出的数据。

  stream.Seek(0,SeekOrigin.Begin);

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 the MemoryStream in a StreamWriter means that when the using statement completes the StreamWriter and MemoryStream are both disposed.

My guess is since you are returning a FileStreamResult the encapsulating File will close the stream for you after the stream is no longer used. In this case, you do not want to use the using statement 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.

stream.Seek(0, SeekOrigin.Begin);

这篇关于而在ASP创建一个可下载的文本文件MVC 3无法访问已关闭的流的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆