2010-02-01 188 views
0

确定我正在从服务器下载文件,我打算把它删除大干快上的客户端下载后,我已在服务器上下载的文件..从服务器上下载一个文件,然后删除服务器

我的下载代码工作正常,但我不知道什么时候该命令删除该文件。

string filepath = restoredFilename.ToString(); 

      // Create New instance of FileInfo class to get the properties of the file being downloaded 
      FileInfo myfile = new FileInfo(filepath); 

      // Checking if file exists 
      if (myfile.Exists) 
      { 

       // Clear the content of the response 
       Response.ClearContent(); 

       // Add the file name and attachment, which will force the open/cancel/save dialog box to show, to the header 
       Response.AddHeader("Content-Disposition", "attachment; filename=" + myfile.Name); 

       //Response.AddHeader("Content-Disposition", "inline; filename=" + myfile.Name); 
       // Add the file size into the response header 
       Response.AddHeader("Content-Length", myfile.Length.ToString()); 

       // Set the ContentType 
       Response.ContentType = ReturnExtension(myfile.Extension.ToLower()); 

       //// Write the file into the response (TransmitFile is for ASP.NET 2.0. In ASP.NET 1.1 you have to use WriteFile instead) 
       Response.TransmitFile(myfile.FullName); 

       // End the response 
       Response.End(); 

      } 

现在我知道到Response.End()将停止每一件事情,并返回值,所以是有另一种方式也这样做..

我需要调用一个函数

DeleteRestoredFileForGUI(restoredFilename);

删除的文件,但不知道放在哪里。我试图把之前和之后到Response.End(),但它不工作..

任何帮助表示赞赏...谢谢

+0

它会运行此页面代码。而不是做response.end()运行response.redirect(“〜/ page-for-delete.aspx?file = delete.dat”,false); - 通过添加false,您继续处理此页面上的信息。 – Kieran 2010-02-02 00:05:50

+0

@Kieran,TransmitFile将限制文件传输时的响应,并且Response.Redirect将导致响应冲突。 – 2010-02-02 00:24:17

回答

4

添加

Response.Flush(); 
DeleteRestoredFileForGUI(restoredFilename); 

调用的TransmitFile(后)和沟呼叫到Response.End()(你不需要它)。

如果不行,则沟的TransmitFile(),并与去:

Stream s = myFile.OpenRead(); 
int bytesRead = 0; 
byte[] buffer = new byte[32 * 1024] //32k buffer 
while((bytesRead = s.Read(buffer, 0, buffer.Length)) > 0 && 
     Response.IsClientConnected) 
{ 
    Response.OutputStream.Write(buffer, 0, bytesRead); 
    Response.Flush(); 
} 
+0

response.OutputStream.Flush()不工作... – user175084 2010-02-02 00:36:31

+0

对不起,尝试只是Response.Flush() – 2010-02-02 00:41:01

+0

确定第一部分工作...但有没有使用响应结束的任何顾虑 – user175084 2010-02-02 01:00:06

0

你是以下的一般模式使我不知道,你在干什么呢?

  1. 为客户创建数据,并保存到
  2. 磁盘传输文件到客户端删除
  3. 文件

如果你是,你可能会改变你的系统在内存中运行。由于内存在.NET中管理你就不必这样做手工清理,并根据文件的大小,这可能是一个好一点的也更快:

  1. 客户端和保存到的MemoryStream
  2. 创建数据
  3. 发送流给客户
0

由于设置在头文件名,你有两个选择:

  1. 读取文件内容为一个字符串,删除文件,EC将/字符串作为消息的主体。

  2. 将文件重命名为delete-filename.xxx,然后创建一些外部进程(可能是cron作业?),并删除以该前缀开头的所有文件。

2

您不能立即删除该文件,因为它可能尚未下载。从服务器端来说,没有简单的方法告诉你文件已经成功下载。如果浏览器打开打开/保存对话框,该怎么办?直到对话被确认,下载才会开始。 (这可能不会立即和/或对话框可能被取消) 或者如果它是一个大文件并且连接在完全下载之前被删除,该怎么办?是否可以再次尝试下载?

通常推荐的处理您的情况的方法是将删除作为一个单独的过程,经过一段时间后允许您(相当)确定该文件不再需要和/或可以重新创建/如果需要恢复。

根据您的情况,您可以有一个单独的进程定期删除/处理旧文件。或者,如果流量较低,则每次请求新文件时都可以检查并删除旧文件。

旧文件的标识可能基于文件时间或darabase中的相​​关值。无论哪种方式,如果有潜在的大量文件需要处理,如果不太可能识别大量要删除的文件,则不太可能需要频繁检查的开销。
此外,请务必避免大量文件被ASAP(磁盘空间真的是个问题?)造成的后果,以避免可能在需要时删除它们或通过热烈检查创建性能副作用的副作用。

+0

所以这意味着生病必须测试它更多...谢谢 – user175084 2010-02-02 01:23:00