Crc32 был сломан

Задача: Я хочу на лету создавать zip-архивы, содержащие определенное количество файлов Excel. Файлы Excel создаются из базы данных также на лету. Вот часть простого метода:

using (var stream = new MemoryStream())
            {
                using (var zipPackage = new ZipHelper(stream))
                {
                    foreach (var dt in res)
                    {
                        MemoryStream ms = new MemoryStream();
                        XLWorkbook wb = new XLWorkbook();
                         wb.Worksheets.Add(dt);
                         wb.SaveAs(ms);
                            zipPackage.Add(ms,
                                string.Format(CultureInfo.InvariantCulture, "{0}.xlsx",                                    string.Format(CultureInfo.InvariantCulture, dt.TableName)));
                        ms.Flush();
                        ms.Close();
                    }
                }
                stream.Flush();
                LoadZipToResponse(stream);
            }

Проблема:

При попытке разархивировать получившийся архив получаю ошибку "Архив поврежден или имеет неверный формат". В архиве я вижу, что Crc32 is 00000000 для всех файлов.

//Add mehod
public ZipHelper Add(MemoryStream ms, string cleanName)
        {
            var zipEntry = new ZipEntry(cleanName)
            {
                DateTime = DateTime.Now,
                Size = ms.Length
            };
            zipEntry.CompressionMethod = CompressionMethod.Stored;
            _crc.Reset();
            _crc.Update(ms.ToArray());
            zipEntry.Crc = _crc.Value;
            _zipStream.PutNextEntry(zipEntry);
            _zipStream.Write(ms.GetBuffer(), 0, (int)ms.Length);
            _zipStream.CloseEntry();
            return this;
        }

//LoadZipToResponse 
        private void LoadZipToResponse(MemoryStream stream)
        {
            Response.ContentType = "application/zip";
            Response.AppendHeader("content-disposition", "attachment; filename=\"" + "DataExport.zip" + "\"");
            Response.CacheControl = "Private";
            Response.Cache.SetExpires(DateTime.Now.AddMinutes(5));
            Page.Response.BinaryWrite(stream.GetBuffer());
            stream.Close();
            Response.Flush();
            Response.End();
        }

Вопрос: Перед тем, как задать этот вопрос, я перепробовал много вариантов сжатия и настроек Crc32. Также я заметил, что при создании только одного файла Excel нет ошибок. В противном случае в архиве я вижу, что Crc32 равен 00000000 для всех файлов, и я получаю сообщение об ошибке при попытке разархивировать архив «Архив поврежден или имеет неправильный формат». В чем причина такого поведения SharpZipLib?


person Vsevolod Romanovski    schedule 13.01.2016    source источник
comment
связанные: stackoverflow.com/questions/5461207/   -  person Pogrindis    schedule 13.01.2016
comment
см. аналогичный вопрос stackoverflow.com/questions/6671054/   -  person lsalamon    schedule 13.01.2016