我需要在内存中创建一个 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 文件中)。
如果我创建一个名为“Inner.zip”的条目而不写入它,我可以创建一个空的内部 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;
}
不过,这只会创建一个 Windows 不知道如何打开的无效 .zip 文件。
提前致谢!
慕容森
蛊毒传说
相关分类