Пример ICSharpCode.SharpZipLib.Zip с деталями переменной crc - PullRequest
0 голосов
/ 31 марта 2011

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

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

Ответы [ 2 ]

2 голосов
/ 13 июля 2011

кажется, что вы не создаете каждый 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.

Удачи:)

0 голосов
/ 15 августа 2011

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

2: Я решил эту проблему, создав утилиту Compression Compress. Мне пришлось динамически составлять и возвращать 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-файл (задержка в процессе / ввод-вывод / тайм-ауты и т. Д.).

...