在C#中处理内存中文件的最佳方法是什么?

时间:2012-05-04 15:47:16

标签: c# memorystream

我正在构建一个动态创建PowerPoint演示文稿的ASP.NET Web应用程序。我有基本的工作,但它在硬盘上创建实际的物理文件。对于大型多用户Web应用程序而言,这似乎不是一个好主意。如果应用程序在内存中创建了演示文稿然后将它们传回给用户,似乎会更好。我应该使用MemoryStream类而不是操作文件?我不太确定我理解使用文件和使用Streams之间的区别。它们有点可以互换吗?有人能指出我在内存而不是在磁盘上进行文件类型操作的良好资源吗?我希望我已经很好地描述了这一点。

科里

3 个答案:

答案 0 :(得分:2)

您正在尝试根据“似乎不是一个好主意”的衡量标准来决定您认为应用程序的性能会受到影响,这几乎不是科学的。最好同时实现这两者并进行比较,但首先应列出您对任一实现的关注。

以下是一些想法:

  • 临时文件和内存中的流之间确实没有太大区别。如果它们足够小,两者都会在物理内存中有内容,如果有内存压力,它们都会打到磁盘上。如果主要关注清理文件,请考虑对文件使用临时Delete on close files
  • 操作系统在管理带缓存的大文件方面做得非常好,需要确保纯内存解决方案至少与之匹配。
  • 由于“所有数据都是单字节数组”合同,MemoryStream不是合理大小的流的最佳实现(参见我在https://stackoverflow.com/a/10424137/477420的回答)。
  • 管理多个大型内存流(即多个用户)对于x86平台来说很有趣,而不是x64平台的关注。
  • 某些API根本不提供使用基于流的类并需要物理文件的方法。

答案 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。

基本上,蒸汽只是处理大量数据的一种方式,您不必或不能一次将所有数据加载到内存中。因此,不是将整个数据集读取或写入巨型数组或其他内容,而是打开一个流,它为您提供相当于光标的流。您可以将当前位置移动到流中的任何位置,然后从该点读取或写入。