Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.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# Response.TransmitFile,并在传输后将其删除_C#_Asp.net_File Io_Gedcom_Response.transmitfile - Fatal编程技术网

C# Response.TransmitFile,并在传输后将其删除

C# Response.TransmitFile,并在传输后将其删除,c#,asp.net,file-io,gedcom,response.transmitfile,C#,Asp.net,File Io,Gedcom,Response.transmitfile,我必须在我的站点中实现GEDCOM导出 “我的.net代码”在单击“导出到gedcom”时在服务器上创建了一个文件 然后我需要将它从服务器下载到客户端,并询问用户在哪里保存该文件,这意味着需要savedialog 下载后,我想从服务器上删除该文件 我有一个代码可以将文件从服务器传输到客户端: Response.ContentType = "text/xml"; Response.AppendHeader("Content-Disposition", "attachment; filename="

我必须在我的站点中实现GEDCOM导出

“我的.net代码”在单击“导出到gedcom”时在服务器上创建了一个文件

然后我需要将它从服务器下载到客户端,并询问用户在哪里保存该文件,这意味着需要savedialog

下载后,我想从服务器上删除该文件

我有一个代码可以将文件从服务器传输到客户端:

Response.ContentType = "text/xml";
Response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName);
Response.TransmitFile(Server.MapPath("~/" + FileName));
Response.End();
由此

但是我无法删除此代码后面的文件,因为
Response.End
ends Response,所以在该行之后编写的任何代码都不会执行


如果我在
Response.End()之前执行代码删除文件,则文件不传输,我得到一个错误。

如果文件相当小,您可以将其加载到字节数组中,以便在仍然能够发送数据的情况下删除文件:

Response.ContentType = "text/xml";
Response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName);
string path = Server.MapPath("~/" + FileName);
byte[] data = File.ReadAllBytes(path);
File.Delete(path);
Response.BinaryWrite(data);
Response.End();

在Response.End之后放置的任何内容都不会执行,因为它会抛出ThreadAbortException以在该点停止页面的执行

请尝试以下方法:

string responseFile = Server.MapPath("~/" + FileName);

try{
    Response.ContentType = "text/xml";
    Response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName);
    Response.TransmitFile(responseFile);
    Response.Flush();
}
finally {
    File.Delete(responseFile);
}

嗨,Response.TransmitFile和Response.BinaryWrite在性能上有什么区别吗?@Radhi:没有。BinaryWrite当然更快,因为内存中已经有了数据,但与加载数据一起,它做的事情与TransmitFile相同。响应.Flush做什么,响应.End做什么??请让我知道差异?Response.Flush强制输出任何缓冲输出(如果有),但不会抛出ThreadAbortException-响应仍在进行中。End刷新,但随后抛出无法停止的ThreadAbortException。将删除代码放入Finally块可确保无论结果如何,删除代码都将运行。这不会处理用户在文件下载对话框中单击“取消”时的情况。当发生这种情况时,会抛出一个HttpException,并显示消息“远程主机关闭了连接。错误代码为0x800703E3”。然后在finally块中,删除失败,出现IOException—“进程无法访问文件'C:\Windows\TEMP\tmp5CA3.tmp',因为它正被另一个进程使用。”我添加了一个catch(HttpException)并在catch中调用Response.End(),这对我很有效