我要的大文件到一个网页浏览器,在这里我创建该文件到服务器上转移触发用户下载,然后将其删除之后立即。我发现足够的例子看,我应该使用Response.TransmitFile或Response.WriteFile ......但听说有与这两个问题:

WriteFile的是同步的,但它把它发送给用户之前缓冲在存储器中的文件中。因为我处理非常大的文件,这可能会导致问题。

的TransmitFile不在本地缓冲区,所以它的工作,对于大文件,但它是异步的,所以我不能打电话的TransmitFile后删除该文件。显然,刷新该文件不保证我可以删除吗?

什么是处理这个问题的最佳方式?

有是的BinaryWrite也可以...我通过文件流循环,在段复制它?

有帮助吗?

解决方案

下面是它使用的TransmitFile但允许你做什么,一旦它的使用委托做了一个很好的解决方案:

HTTP://提高没有自动跳转/博客/ 2008/03 /第29 /响应的TransmitFile密会杀,你的应用程序

就在与文件删除结束替换记录。

其他提示

  

WriteFile的是同步的,但它   缓存在内存中的文件之前,   它发送给用户。因为我   处理非常大的文件,这   可能导致问题。

我相信你可以通过设置禁用缓冲以WriteFile的 Response.BufferOutput = FALSE;

在这个已被设置为false,你应该能够调用WriteFile的无缓冲...

你能提交到磁盘文件(随机名称等),并开始发送,但一个条目添加到数据库表与临时文件名,你定义了一段时间之后,必须通过这些DB条目进行一些清理工作走和删除从磁盘上的文件是否已老化。

<强> WriteFile的方式被用来从服务器下载的小文件,尺寸参数必须是零和最大的Int32值之间,传输文件前它缓冲在存储器中的文件中。 的TransmitFile 方式来从服务器下载大文件,并尝试删除该文件同时下载它,然后它抛出异常时不将文件缓存到memory.But。下面是将下载后删除该文件中的代码。

 FileStream fs = new FileStream(@"D:\FileDownLoad\DeskTop.zip", FileMode.OpenOrCreate);
        MemoryStream ms = new MemoryStream();
        fs.CopyTo(ms);
        context.Response.AppendHeader("content-disposition", "attachment; filename=" + "DeskTop.zip");
        context.Response.ContentType = "application/octet-stream";
        context.Response.BinaryWrite(ms.ToArray());
        fs.Close();
        File.Delete(@"D:\FileDownLoad\DeskTop.zip");
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top