Мне нужно создать zip-файл в памяти, а затем отправить zip-файл клиенту. Однако в некоторых случаях созданный zip-файл должен содержать другие zip-файлы, которые также были сгенерированы в памяти. Например, структура файла может выглядеть следующим образом:
SendToClient.zip
InnerZip1.zip
File1.xml
File2.xml
InnerZip2.zip
File3.xml
File4.xml
Я пытался использовать библиотеку System.IO.Compression.ZipArchive. Я не могу использовать библиотеку System.IO.Compression.ZipFile, потому что версия моего проекта .NET не совместима с ней.
Вот пример того, что я пробовал.
public Stream GetMemoryStream() {
var memoryStream = new MemoryStream();
string fileContents = "Lorem ipsum dolor sit amet";
string entryName = "Lorem.txt";
string innerZipName = "InnerZip.zip";
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) {
ZipArchiveEntry entry = archive.CreateEntry(Path.Combine(innerZipName, entryName), CompressionLevel.Optimal);
using (var writer = new StreamWriter(entry.Open())) {
writer.Write(fileContents);
}
}
return memoryStream
}
Однако, это просто помещает Lorem.txt в папку с именем «Inner.zip» (вместо реального zip-файла).
Я могу создать пустой внутренний zip-файл, если я создаю запись с именем «Inner.zip» без записи в нее. Однако я ничего не могу добавить к нему, и запись в запись с именем «Inner.zip \ Lorem.txt» впоследствии просто снова создает папку (рядом с пустым .zip-файлом с тем же именем).
Я также попытался создать отдельный архив, сериализовать его с потоком памяти, а затем записать его в исходный архив в виде .zip.
public Stream CreateOuterZip() {
var memoryStream = new MemoryStream();
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) {
ZipArchiveEntry entry = archive.CreateEntry("Outer.zip", CompressionLevel.NoCompression);
using (var writer = new BinaryWriter(entry.Open())) {
writer.Write(GetMemoryStream().ToArray());
}
}
return memoryStream;
}
Это просто создает недопустимый файл .zip, который, однако, Windows не знает, как его открыть.
Заранее спасибо!