2010-02-01 151 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