我正在构建一个动态创建PowerPoint演示文稿的ASP.NET Web应用程序。我有基本的工作,但它在硬盘上创建实际的物理文件。对于大型多用户Web应用程序而言,这似乎不是一个好主意。如果应用程序在内存中创建了演示文稿然后将它们传回给用户,似乎会更好。我应该使用MemoryStream类而不是操作文件?我不太确定我理解使用文件和使用Streams之间的区别。它们有点可以互换吗?有人能指出我在内存而不是在磁盘上进行文件类型操作的良好资源吗?我希望我已经很好地描述了这一点。
科里
答案 0 :(得分:2)
您正在尝试根据“似乎不是一个好主意”的衡量标准来决定您认为应用程序的性能会受到影响,这几乎不是科学的。最好同时实现这两者并进行比较,但首先应列出您对任一实现的关注。
以下是一些想法:
答案 1 :(得分:1)
文件和流是相似的,是的。两者都基本上流式传输byte
阵列......一个来自内存,一个来自硬盘。如果您使用的API允许您生成流,那么您可以轻松地使用Response
对象将其提供给用户。
以下代码将采用PowerPoint内存对象(您需要为自己的API修改它,但您可以获得一般的想法),将其保存到MemoryStream
,然后设置正确的标题并将流写入响应(然后让用户将文件保存到本地计算机):
SaveFormat format = SaveFormat.PowerPoint2007;
Slideshow show = PowerPointWriter.Generate(report, format);
MemoryStream ms = new MemoryStream();
show.Save(ms, format);
Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/vnd.ms-powerpoint";
Response.AddHeader("Content-Disposition", "attachment; filename=\"Slideshow.ppt\"");
Response.BinaryWrite(ms.ToArray());
Response.End();
答案 2 :(得分:0)
是的,我会推荐MemoryStream。通常,只要您访问文件,就会使用流进行访问。有许多种流(例如网络流,文件流和存储器流),它们都实现相同的基本接口。如果您已经在文件流中创建文件,而不是像字符串或字节数组那样,那么它应该只需要很少的编码更改就可以切换到MemoryStream。
基本上,蒸汽只是处理大量数据的一种方式,您不必或不能一次将所有数据加载到内存中。因此,不是将整个数据集读取或写入巨型数组或其他内容,而是打开一个流,它为您提供相当于光标的流。您可以将当前位置移动到流中的任何位置,然后从该点读取或写入。