2012-02-27 51 views
0

我有一種方法可以使用DotNetZip壓縮一個或多個文件,並且它一直在正常工作。我今天第一次收到一個錯誤,它似乎與檔案的總大小有關。使用相同的60mb .tiff圖像,我會添加一些額外的副本,測試,重複。它運行良好,直到大約添加了10個圖像,然後,當我使用WinRar打開Zip文件時,我會得到「意外的存檔結束」錯誤。以這種方式進行測試,我相信我已經排除了與我的代碼或文件相關的問題(正在損壞或出現問題)。代碼沒有錯誤,只有WinRar。當我打開Zip文件時,只有一個文件顯示大小爲「0」。因此,似乎正在達到某種尺寸限制,並且不允許創建存檔。我只是不知道它是什麼限制。這裏是我的代碼,如果有幫助的話:使用DotNetZip創建Zip文件時出錯:意外的存檔結束

HttpContext.Current.Response.Clear(); 
HttpContext.Current.Response.ContentType = "application/zip"; 
HttpContext.Current.Response.AddHeader("content-disposition", "filename=" + "MyFileName" + DateTime.Now.ToString("MMddyyyy") + ".zip"); 

using (var zip = new Ionic.Zip.ZipFile()) 
{ 
    zip.MaxOutputSegmentSize = 819200; // I tried adding this and it did not fix the problem 

    foreach (var file in files) 
    { 
     zip.AddFile(file.FileLocation, file.ZipFileDirectory).FileName = 
      (!string.IsNullOrEmpty(file.ZipFileDirectory) && (file.ZipFileDirectory != @"\")) ? 
       string.Format(@"{0}\{1}", file.ZipFileDirectory, file.FileName) : 
       file.FileName; 
    } 

    zip.Save(HttpContext.Current.Response.OutputStream); 
} 
+0

如果直接將zip保存到文件(不使用'HttpContext.Current.Response'),是否也會發生同樣的情況? – svick 2012-02-27 17:38:23

回答

2

你需要在完成寫入之後刷新流嗎?

HttpContext.Current.Response.Flush();

編輯:

呼叫HttpContext.Current.ApplicationInstance.CompleteRequest()

+0

.Flush()本身並沒有幫助,但是,.End()會。我也嘗試在.End()之前添加.Flush(),這也起作用。我記得過去使用過.End(),但它拋出了異常:System.Threading.ThreadAbortException(現在仍然是),所以我將它移除了,因爲它似乎沒有它就可以正常工作。你知道它爲什麼需要.End()對於一個大的檔案,對於較小的檔案可以正常工作嗎?如果您編輯您的帖子以包含.End(),我會將其標記爲答案 - 您可以添加任何其他信息。謝謝。 – StronglyTyped 2012-02-27 21:39:51

+0

狩獵通過System.Web,它看起來像End()拋出一個ThreadAbortException如果「處理步驟」不可取消 - 如果該處理程序不是IHttpAsyncHandler。 http://support.microsoft.com/kb/312629/上的建議是使用HttpContext.Current.ApplicationInstance.CompleteRequest()代替。你能否看到這是否有效? – foson 2012-02-28 15:48:20

+0

在我的情況HttpContext.Current.Response.End();爲一個文件存檔和大型文件存檔(超過1400個文件)工作。 – nccsbim071 2012-05-18 15:15:31

3

這裏接受的答案並沒有解決我的問題,但是,採用的一些評論使我走上了正確的道路。什麼瞭解決這個問題對我來說是簡單地增加

HttpContext.Current.Response.End();

所有的處理完成後,(在我的情況下,代碼樣本塊之後,using塊之外)。

相關問題