StreamWriter写入MemoryStream

edi*_*ode 21 .net c# memorystream stream

我的印象是,当你调用Flush()StreamWriter对象时,它会写入底层流,但显然我的代码不是这种情况.

而不是写入我的文件,它只会写什么.我出错的任何想法?

    public FileResult DownloadEntries(int id)
    {
        Competition competition = dataService.GetCompetition(id);
        IQueryable<CompetitionEntry> entries = dataService.GetAllCompetitionEntries().Where(e => e.CompetitionId == competition.CompetitionId);

        MemoryStream stream = new MemoryStream();
        StreamWriter csvWriter = new StreamWriter(stream, Encoding.UTF8);

        csvWriter.WriteLine("First name,Second name,E-mail address,Preferred contact number,UserId\r\n");

        foreach (CompetitionEntry entry in entries)
        {
            csvWriter.WriteLine(String.Format("{0},{1},{2},{3},{4}",
                entry.User.FirstName,
                entry.User.LastName,
                entry.User.Email,
                entry.User.PreferredContactNumber,
                entry.User.Id));
        }

        csvWriter.Flush();

        return File(stream, "text/plain", "CompetitionEntries.csv");
    }
Run Code Online (Sandbox Code Playgroud)

Dav*_*len 26

我相信你需要设定Stream.Position = 0.写入时,它会将位置前进到流的末尾.当你把它传递给File()它时,它从它所在的位置开始 - 结束.

我认为以下内容将起作用(没有尝试编译):

stream.Position = 0;
return File(stream, "text/plain", "CompetitionEntries.csv");
Run Code Online (Sandbox Code Playgroud)

这样您就不会创建任何新对象或复制基础数组.

  • 请注意,您*不得*在控制器代码中配置编写器和流.复制粘贴时,您可能需要在代码中添加注释. (3认同)

Ale*_*kov 8

您的MemoryStream位于最后.更好的代码是使用MemoryStream(Byte [],Int32,Int32,Boolean)构造函数在同一缓冲区上创建新的R/O内存流.

修剪缓冲区上最简单的r/w:

 return File(new MemoryStream(stream.ToArray());
Run Code Online (Sandbox Code Playgroud)

R/o没有复制内部缓冲区:

 return File(new MemoryStream(stream.GetBuffer(), 0, (int)stream.Length, false);
Run Code Online (Sandbox Code Playgroud)

注意:注意不要通过File(Stream)处理返回的流.否则你会得到某种"ObjectDisposedException".即如果你只是将原始流的位置设置为0并将StreamWriter包装成使用,你将进入返回已处理的流.