在C#中处理内存中文件的最佳方法是什么?
我正在构建一个ASP.NET web应用程序,它可以动态创建PowerPoint演示文稿。我有基本的工作,但它会在硬盘上创建实际的物理文件。对于大型多用户web应用程序来说,这似乎不是一个好主意。如果应用程序在内存中创建演示文稿,然后将其流式传输回用户,似乎会更好。我应该使用MemoryStream类而不是操纵文件吗?我不确定我是否理解使用文件和使用流之间的区别。它们可以互换吗?有人能给我指出一个在内存中而不是磁盘上进行文件类型操作的好资源吗?我希望我描述得足够好在C#中处理内存中文件的最佳方法是什么?,c#,memorystream,C#,Memorystream,我正在构建一个ASP.NET web应用程序,它可以动态创建PowerPoint演示文稿。我有基本的工作,但它会在硬盘上创建实际的物理文件。对于大型多用户web应用程序来说,这似乎不是一个好主意。如果应用程序在内存中创建演示文稿,然后将其流式传输回用户,似乎会更好。我应该使用MemoryStream类而不是操纵文件吗?我不确定我是否理解使用文件和使用流之间的区别。它们可以互换吗?有人能给我指出一个在内存中而不是磁盘上进行文件类型操作的好资源吗?我希望我描述得足够好 Corey是的,我推荐Memo
Corey是的,我推荐MemoryStream。通常,每次访问文件时,您都是使用流进行访问。有许多种流(例如网络流、文件流和内存流),它们都实现相同的基本接口。如果您已经在文件流中创建文件,而不是像字符串或字节数组这样的东西,那么切换到MemoryStream应该只需要很少的编码更改
基本上,steam只是一种处理大量数据的方法,而您不必或无法将所有数据一次性加载到内存中。因此,与其将整个数据集读写到一个巨大的数组或其他什么东西中,不如打开一个流,它提供了一个相当于光标的数据流。您可以将当前位置移动到流中的任何位置,并从该点读取或写入该位置。是的,我建议使用MemoryStream。通常,每次访问文件时,您都是使用流进行访问。有许多种流(例如网络流、文件流和内存流),它们都实现相同的基本接口。如果您已经在文件流中创建文件,而不是像字符串或字节数组这样的东西,那么切换到MemoryStream应该只需要很少的编码更改
基本上,steam只是一种处理大量数据的方法,而您不必或无法将所有数据一次性加载到内存中。因此,与其将整个数据集读写到一个巨大的数组或其他什么东西中,不如打开一个流,它提供了一个相当于光标的数据流。您可以将当前位置移动到流中的任何位置,并从该点读取或写入该位置。文件和流类似,是的。两者基本上都是流式传输一个
字节
数组…一个来自内存,一个来自硬盘。如果您正在使用的API允许您生成一个流,那么您可以很容易地这样做,并使用Response
对象将其提供给用户
以下代码将获取PowerPoint内存对象(您需要为自己的API对其进行修改,但您可以了解大致情况),将其保存到MemoryStream
,然后设置适当的标题并将流写入响应(这样用户就可以将文件保存到本地计算机):
文件和流是相似的,是的。两者基本上都是流式传输一个
字节
数组…一个来自内存,一个来自硬盘。如果您正在使用的API允许您生成一个流,那么您可以很容易地这样做,并使用Response
对象将其提供给用户
以下代码将获取PowerPoint内存对象(您需要为自己的API对其进行修改,但您可以了解大致情况),将其保存到MemoryStream
,然后设置适当的标题并将流写入响应(这样用户就可以将文件保存到本地计算机):
您正试图根据“似乎不是一个好主意”的度量做出您认为会影响应用程序性能的决策,这几乎是不科学的。最好同时实现并进行比较,但首先应该列出您对这两种实现的担忧 以下是一些开始的想法:
- 临时文件和内存流之间实际上没有太大区别。如果它们足够小,它们的物理内存中都会有内容,如果内存不足,它们都会命中磁盘。如果清理文件是最主要的考虑,请考虑使用临时文件。
- 操作系统在使用缓存管理大型文件方面已经做得很好,需要确保纯内存解决方案至少与之匹配
- MemoryStream并不是大小合理的流的最佳实现,因为它的“所有数据都在单字节数组中”契约(请参阅我的答案)
- 对于x86平台而言,管理多个大型内存流(即多个用户)是一件有趣的事情,而对于x64平台而言,这一点就不那么重要了
- 一些API根本不提供处理基于流的类的方法,并且需要物理文件李>
- 临时文件和内存流之间实际上没有太大区别。如果它们足够小,它们的物理内存中都会有内容,如果内存不足,它们都会命中磁盘。如果清理文件是最主要的考虑,请考虑使用临时文件。
- 操作系统在使用缓存管理大型文件方面已经做得很好,需要确保纯内存解决方案至少与之匹配
- MemoryStream并不是大小合理的流的最佳实现,因为它的“所有数据都在单字节数组中”契约(请参阅我的答案)
- 对于x86平台而言,管理多个大型内存流(即针对多个用户)是一件有趣的事情,而不是一件令人担忧的事情
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();