我需要在内存中创建一个zip文件,然后将该zip文件发送给客户端。但是,有些情况下,创建的zip文件将需要包含其他也在内存中生成的zip文件。例如,文件结构可能如下所示:
然而,这只是将Lorem.txt放在名为“Inner.zip”的文件夹中(而不是实际的zip文件中)。
如果我创建一个名为“Inner.zip”的条目而不写入它,则可以创建一个空的内部zip文件。但是我无法向其中添加任何内容,并且随后对称为“Inner.zip \ Lorem.txt”的条目进行写入仅会再次创建文件夹(与名称相同的空.zip文件一起)。
我还尝试创建单独的归档文件,用内存流序列化该文件,然后将其作为.zip文件写入原始归档文件中。
SendToClient.zip
InnerZip1.zip
File1.xml
File2.xml
InnerZip2.zip
File3.xml
File4.xml
我一直在尝试使用System.IO.Compression.ZipArchive库。由于我的项目版本的.NET与System.IO.Compression.ZipFile库不兼容,因此我不能使用它。
以下是我尝试过的示例。
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;
}
这只是创建了一个无效的.zip文件,Windows不知道如何打开它。
提前致谢!