Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 传输后需要从服务器上删除的大型文件的WriteFile与TransmitFile_C#_Asp.net_Writefile_Transmitfile - Fatal编程技术网

C# 传输后需要从服务器上删除的大型文件的WriteFile与TransmitFile

C# 传输后需要从服务器上删除的大型文件的WriteFile与TransmitFile,c#,asp.net,writefile,transmitfile,C#,Asp.net,Writefile,Transmitfile,我必须触发用户将大文件下载到webbrowser,在那里我创建要在服务器上传输的文件,然后立即将其删除。我已经找到了足够多的例子来说明我应该使用Response.TransmitFile或Response.WriteFile。。。但我听说两者都有问题: WriteFile是同步的,但在将文件发送给用户之前,它会在内存中缓冲该文件。因为我处理的是非常大的文件,这可能会导致问题 TransmitFile不在本地进行缓冲,因此它适用于大型文件,但它是异步的,因此调用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");