2012-02-27 8 views
0

DotNetZipを使用して1つまたは複数のファイルを圧縮して正常に動作する方法があります。今日はじめてエラーが発生し、アーカイブ全体のサイズに関連しているようです。同じ60MBの.tiffイメージを使用して、私はいくつかの余分なコピー、テスト、繰り返しを追加します。約10枚の画像が追加されるまでうまくいき、WinRarを使用してZipファイルを開いたときに「予期しないアーカイブの終了」エラーが発生します。このようにテストすると、私は自分のコードやファイル(破損しているか何か)に関連しているという問題を排除したと私は信じています。コードはエラーではなく、WinRarのみです。 Zipファイルを開くと、サイズが「0」のファイルが1つしか表示されません。だから、ある種のサイズ制限に達しているようで、アーカイブを作成できないようです。どのくらいの制限があるのか​​分かりません。それが助けがあれば、私のコードはあります: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

答えて

2

ストリームを書き込む必要がありますか?

HttpContext.Current.Response.Flush();

EDIT:

コールHttpContext.Current.ApplicationInstance.CompleteRequest()

+0

.Flush()自体は役に立ちませんが、.End()は役に立ちます。私はまた.End()の前に.Flush()を追加しようとしました。以前は.End()を使用していましたが、System.Threading.ThreadAbortException例外がスローされていました(まだそれが残っています)ので、削除しないと正常に動作したようです。なぜそれが必要かを知っていますか?大規模なアーカイブの場合はEnd()を、小さいアーカイブの場合はうまく機能しますか? .End()を含めるように投稿を編集する場合は、それを回答としてマークします。追加できる追加情報は高く評価されます。ありがとう。 – StronglyTyped

+0

System.Webを通じて狩りをすると、 "ハンドラステップ"がCancellableでない場合、End()がThreadAbortExceptionをスローするように見えます。ハンドラがIHttpAsyncHandlerでない場合。 http://support.microsoft.com/kb/312629/の推奨事項は、代わりにHttpContext.Current.ApplicationInstance.CompleteRequest()を使用することです。それが動作するかどうか確認できますか? – foson

+0

私の場合、HttpContext.Current.Response.End(); 1つのファイルアーカイブと大規模なファイルアーカイブ(1400を超えるファイル)の両方で動作します。 – nccsbim071

3

ここ受け入れ答えは、コメントの一部を採用し、しかし、私のために問題を解決しませんでした私を正しい道に導いた。それは私のためにこれを解決するために取った何を、すべての処理が完了した後に、単純に(使用するブロックの外側で、すぐにコードのサンプルブロックの後に、私の場合には)

HttpContext.Current.Response.End();

を追加されました。

関連する問題