2012-05-04 43 views
0

我正在构建一个ASP.NET Web应用程序,用于即时创建PowerPoint演示文稿。我有基本的工作,但它创建硬盘上的实际物理文件。对于大型多用户Web应用程序来说,这似乎不是一个好主意。看起来如果应用程序在内存中创建了演示文稿,然后将它们流式传输回用户会更好。我应该使用MemoryStream类来处理文件,而不是操作文件?我不完全确定我理解使用文件和使用Streams的区别。它们有些可以互换吗?任何人都可以指向我在内存而不是磁盘上进行文件类型操作的好资源吗?我希望我已经描述得很好。在C#中处理内存中的文件的最佳方式是什么?

Corey

+3

你用什么API来创建PowerPoint演示文稿? – user957902

+0

我正在使用DocumentFormat.OpenXML库中的类。 –

回答

0

是的,我会推荐MemoryStream。通常,每当你访问一个文件时,你都在使用一个流。有多种流(例如网络流,文件流和内存流),它们都实现相同的基本接口。如果您已经在文件流中创建文件,而不是类似字符串或字节数组的文件,那么只需要很少的编码更改即可切换到MemoryStream。

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

1

文件和流类似,是的。两者基本上都是一个byte阵列......一个来自内存,一个来自硬盘。如果您使用的API允许您生成流,那么您可以轻松地完成该操作,并使用Response对象将其提供给用户。

以下代码需要一个PowerPoint内存对象(您需要为自己的API修改它,但您可以获得一般想法),将其保存到MemoryStream,然后设置正确的标题并写入流到Response(那么这将让用户将文件保存到本地计算机上):

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

您正试图使您认为根据您的应用程序的影响性能的决定“似乎并不像一个很好的想法“测量,这几乎是科学的。实现两者并进行比较会更好,但首先您应该列出您对任一实现的担忧。

这里有一些想法开始:

  • 有真的不临时文件和内存流之间太大的区别。如果足够小,两者都会在物理内存中拥有内容,如果存在内存压力,两者都会触及磁盘。考虑为文件使用临时Delete on close files,如果清理文件是主要问题。
  • 操作系统已经在使用高速缓存管理大文件方面做得很好,因此需要确保纯内存解决方案至少与其匹配。
  • 由于“所有数据都是单字节数组”合同(请参阅我在https://stackoverflow.com/a/10424137/477420的答案),MemoryStream不是合理大小的流的最佳实现。
  • 管理多个大内存流(即针对多个用户)对于x86平台很有趣,而对于x64则不太关心。
  • 某些API根本不提供使用基于流的类并需要物理文件的方式。
相关问题