Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.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
Asp.net 在Response.WriteFile()中使用文件后,何时可以删除该文件?_Asp.net - Fatal编程技术网

Asp.net 在Response.WriteFile()中使用文件后,何时可以删除该文件?

Asp.net 在Response.WriteFile()中使用文件后,何时可以删除该文件?,asp.net,Asp.net,WriteFile调用是否正确同步,我可以删除调用后立即写入的文件吗?如果内存可用,它是同步的,其他响应命令也是同步的。如果使用RESPONSE.WriteFile()向客户端写入文件,则调用RESPONSE.Flush()将确保它已完全输出到客户端。完成后,您可以将其从Web服务器上删除 如果文件是任务关键型的,那么您可能需要设计一个更健壮的系统。例如,一个客户端脚本,用于验证文件是否已正常接收,然后通知Web服务器该文件可以删除。TransmitFile 您还可以调用TransmitFile

WriteFile调用是否正确同步,我可以删除调用后立即写入的文件吗?

如果内存可用,它是同步的,其他响应命令也是同步的。

如果使用
RESPONSE.WriteFile()
向客户端写入文件,则调用
RESPONSE.Flush()
将确保它已完全输出到客户端。完成后,您可以将其从Web服务器上删除


如果文件是任务关键型的,那么您可能需要设计一个更健壮的系统。例如,一个客户端脚本,用于验证文件是否已正常接收,然后通知Web服务器该文件可以删除。

TransmitFile

您还可以调用TransmitFile,让IIS处理它。它实际上是由IIS在工作进程之外发送的

内存流


如果你真的很偏执,不要发送文件。将其加载到内存流(如果大小合理)并传输。然后,您可以随时删除该文件。IIS永远不会触及磁盘上的文件。

这是解决方案,使用语法
Response.WriteFile(文件名),键入以下代码行:

Response.Flush();
System.IO.File.Delete(fullPathFileName);
Response.End();

它是完全同步的,您可以通过查看带有Lutz Reflector的
HttpResponse.WriteFile
的实现看到这一点。您可以在调用
Response.WriteFile
后立即删除该文件

您不能保证响应流已完全传输到客户端,但调用
response.Flush
也不能保证这一点。因此,我认为在删除文件之前不需要调用
Response.Flush


避免将文件加载到
内存流中
,它不会给您带来任何好处,并且会降低内存使用成本,尤其是对于大型文件。

我刚刚测试了这一点,理论上我同意,但实际上我不同意。文档表明它是同步的,但我刚刚验证了,在我的环境中(VS 2010,dev server,.Net 4),您必须调用Response.Flush,否则文件将在返回之前被删除;Response.Close();删除(路径)尽可能避免使用Response.End()。它抛出不可修补的异常并中止线程。最好使用
Response.SuppressContent=true;HttpContext.Current.ApplicationInstance.CompleteRequest();返回取而代之。