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-файл (задержка в процессе / ввод-вывод / тайм-ауты и т. Д.).