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