DotNetZip Как исправить ошибку 0000000 CRC32?

Я использую DotNetZip для добавления нескольких MemoryStreams в один архив. Пока что мой код работает, когда я выбираю 1 или 2 файла, но не работает, если я добавляю больше. Я обнаружил, что разница в том, что CRC32 - это все 00000000 для этих плохих архивов. Дело в размере архива? Любая помощь приветствуется! Мой код на С#:

foreach(.....){
       var zipEntryName=.....//Get the file name in string;
       var UDocument = .....//Get a object
       var UStream = UDocument .GetStream();
       UStream.Seek(0, SeekOrigin.Begin);
       ZipEntry entry = zipFile.AddEntry(zipEntryName,UStream );
 }
 var outputStream = new MemoryStream();
            outputStream.Seek(0, SeekOrigin.Begin);
            zipFile.Save(outputStream);
            outputStream.Flush();
            return outputStream;

person Steven Zack    schedule 01.11.2013    source источник
comment
В какой строке у вас ошибка?   -  person JMK    schedule 01.11.2013
comment
Нет ошибки при создании zip-файла, но при его открытии возникает ошибка.   -  person Steven Zack    schedule 01.11.2013
comment
На самом деле, когда вы извлекаете zip-файл, он говорит, что архив либо в неизвестном формате, либо поврежден. Но если в цикле foreach есть только 2 или 1 элемент, проблем не будет.   -  person Steven Zack    schedule 01.11.2013
comment
В чем разница между UStream и UB04Stream? Откуда берется последний?   -  person Ben Voigt    schedule 01.11.2013
comment
Извините, я только что отредактировал это. Это одна и та же переменная.   -  person Steven Zack    schedule 01.11.2013


Ответы (1)


Я думаю, это из-за утечки памяти. вы создаете объект в цикле foreach, и здесь возникает проблема, если цикл повторяется больше раз.

здесь проблема возникает в вашем коде:

var UDocument = .....//Get a object

синглтон — это класс, который может быть создан один раз и только один раз. используйте одноэлементный класс, как показано ниже:

public static SingletonSample InstanceCreation()
{
    private static object lockingObject = new object();
    if(singletonObject == null)
    {
         lock (lockingObject)
         {
             singletonObject = new SingletonSample();

         }
    }
    return singletonObject;
}
person Sudhakar Tillapudi    schedule 01.11.2013
comment
Первое предложение выглядит правильно, но я не думаю, что синглтон является подходящим решением. - person Ben Voigt; 01.11.2013
comment
@Be : Спасибо, не могли бы вы показать мне это утверждение -› var UDocument = .....//Получить объект - person Sudhakar Tillapudi; 01.11.2013
comment
Нет, так как это не мой вопрос и не мой код. Я просто не вижу причин использовать здесь синглтон. - person Ben Voigt; 01.11.2013
comment
Вы также не должны писать singleton как SingleTon. Середина T никогда не пишется с большой буквы, и это может запутать многих людей. - person ssube; 02.11.2013
comment
Я действительно не думаю, что это решение моей проблемы с кодом. В противном случае, как вы объясните, что это работает для 1 или 2 цикла, но не работает для большего количества элементов в цикле foreach. Но спасибо за публикацию вашего решения. - person Steven Zack; 02.11.2013