C# 传输后需要从服务器上删除的大型文件的WriteFile与TransmitFile
我必须触发用户将大文件下载到webbrowser,在那里我创建要在服务器上传输的文件,然后立即将其删除。我已经找到了足够多的例子来说明我应该使用Response.TransmitFile或Response.WriteFile。。。但我听说两者都有问题: WriteFile是同步的,但在将文件发送给用户之前,它会在内存中缓冲该文件。因为我处理的是非常大的文件,这可能会导致问题 TransmitFile不在本地进行缓冲,因此它适用于大型文件,但它是异步的,因此调用TransmitFile后无法删除该文件。显然刷新文件也不能保证我可以删除它 处理这个问题的最好方法是什么C# 传输后需要从服务器上删除的大型文件的WriteFile与TransmitFile,c#,asp.net,writefile,transmitfile,C#,Asp.net,Writefile,Transmitfile,我必须触发用户将大文件下载到webbrowser,在那里我创建要在服务器上传输的文件,然后立即将其删除。我已经找到了足够多的例子来说明我应该使用Response.TransmitFile或Response.WriteFile。。。但我听说两者都有问题: WriteFile是同步的,但在将文件发送给用户之前,它会在内存中缓冲该文件。因为我处理的是非常大的文件,这可能会导致问题 TransmitFile不在本地进行缓冲,因此它适用于大型文件,但它是异步的,因此调用TransmitFile后无法删除该
还有二进制文件写入。。。我可以在文件流中循环,将其分段复制吗?这里有一个很好的解决方案,它使用TransmitFile,但允许您在使用委托完成后执行某些操作:
只需将最后的日志记录替换为文件删除即可。能否将文件提交到磁盘(随机名称等),并开始发送,但在定义一段时间后,使用临时文件名向数据库表中添加一个条目,对这些数据库条目进行清理,如果文件已过期,则从磁盘中删除该文件 WriteFile是同步的,但是 将文件缓冲到内存中 将其发送给用户。因为我是 处理非常大的文件,这 可能会引起问题 我相信您可以通过设置 Response.BufferOutput=false
设置为false后,您应该能够在不缓冲的情况下调用WriteFile…WriteFile方法用于从服务器下载小文件,在传输文件之前,size参数必须介于零和最大Int32值之间,它会将文件缓冲在内存中TransmitFile方法用于从服务器下载大文件,它不会将文件缓冲到内存中。但在下载文件时尝试删除文件时,会引发异常。下面是下载文件后删除该文件的代码
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");