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)
这样您就不会创建任何新对象或复制基础数组.
您的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包装成使用,你将进入返回已处理的流.