Пример ICSharpCode.SharpZipLib.Zip с подробными сведениями о переменной crc

Я использую icsharpziplib dll для архивирования файлов sharepoint с помощью С# в asp.net
Когда я открываю файл output.zip, он показывает, что «zip-файл либо поврежден, либо поврежден». И значение crc для файлов в output.zip отображается как 000000.

  1. Как рассчитать или настроить значение контрольной суммы с помощью icharpziplib dll?
  2. Может ли у кого-нибудь быть хороший пример архивирования с использованием потоков памяти?

person Ramesh.kbvr    schedule 31.03.2011    source источник


Ответы (2)


кажется, вы не создаете каждый ZipEntry.

Вот код, который я адаптировал под свои нужды: http://wiki.sharpdevelop.net/SharpZipLib-Zip-Samples.ashx#Create_a_Zip_fromto_a_memory_stream_or_byte_array_1

В любом случае, с SharpZipLib есть много способов работы с zip-файлом: класс ZipFile, класс ZipOutputStream и класс FastZip.

Я использую ZipOutputStream для создания ZIP-файла в памяти, добавления к нему потоков в памяти и, наконец, сброса на диск, и он работает довольно хорошо. Почему ZipOutputStream? Потому что это единственный доступный вариант, если вы хотите указать уровень сжатия и использовать Streams.

Удачи :)

person CharlieBrown    schedule 13.07.2011

1: Вы можете сделать это вручную, но библиотека ICSharpCode позаботится об этом за вас. Также я обнаружил, что «zip-файл либо поврежден, либо поврежден» также может быть результатом неправильного добавления имени вашей zip-записи (например, записи, которая находится в цепочке подпапок).

2: Я решил эту проблему, создав утилиту для сжатия. Мне пришлось динамически составлять и возвращать zip-файлы. Временные файлы не подходили, поскольку процесс должен был выполняться веб-сервисом. Трюк с этим заключался в методах BeginZip(), AddEntry() и EndZip() (потому что я превратил его в утилиту, которую нужно вызывать. Вы можете просто использовать код напрямую, если это необходимо).

Что-то, что я исключил из примера, — это проверки инициализации (например, вызов EndZip() по ошибке) и правильный код утилизации (лучше всего реализовать IDisposable и закрыть zipfileStream и memoryStream, если это применимо).

using System.IO;
using ICSharpCode.SharpZipLib.Zip;

public void BeginZipUpdate()
    {
        _memoryStream = new MemoryStream(200);
        _zipOutputStream = new ZipOutputStream(_memoryStream);
    }

public void EndZipUpdate()
    {
        _zipOutputStream.Finish();
        _zipOutputStream.Close();
        _zipOutputStream = null;
    }

//Entry name could be 'somefile.txt' or 'Assemblies\MyAssembly.dll' to indicate a folder.
//Unsure where you'd be getting your file, I'm reading the data from the database.
public void AddEntry(string entryName, byte[] bytes)
    {
        ZipEntry entry = new ZipEntry(entryName);
        entry.DateTime = DateTime.Now;            
        entry.Size = bytes.Length;            
        _zipOutputStream.PutNextEntry(entry);
        _zipOutputStream.Write(bytes, 0, bytes.Length);
        _zipOutputStreamEntries.Add(entryName);
    }

Таким образом, у вас фактически есть zipOutputStream для записи в memoryStream. Затем после закрытия _zipOutputStream вы можете вернуть содержимое memoryStream.

public byte[] GetResultingZipFile()
    {           
        _zipOutputStream.Finish();
        _zipOutputStream.Close();
        _zipOutputStream = null;
        return _memoryStream.ToArray();
    }

Просто знайте, сколько вы хотите добавить в zip-файл (задержка в процессе / ввод-вывод / тайм-ауты и т. д.).

person MoSlo    schedule 15.08.2011
comment
_memoryStream.GetBuffer() также будет работать для получения byte[], но просто поймите разницу между ними. - person MoSlo; 15.08.2011