谁能告诉我我的代码有什么问题?我想压缩多个xml到一个文件,但结果文件总是空的。
using (MemoryStream zipStream = new MemoryStream())
{
using (ZipArchive zip = new ZipArchive(zipStream, ZipArchiveMode.Create, true))
{
string[] xmls = Directory.GetFiles(@"c:temptest", "*.xml");
foreach (string xml in xmls)
{
var file = zip.CreateEntry(xml);
using (var entryStream = file.Open())
using (var streamWriter = new StreamWriter(entryStream))
{
streamWriter.Write(xml);
}
}
}
using (FileStream fs = new FileStream(@"C:Temptest.zip", FileMode.Create))
{
zipStream.Position = 0;
zipStream.CopyTo(fs);
}
}
请参阅文档中的注释(强调我的):
entryName字符串应该反映条目的相对路径您希望在zip归档文件中创建。您提供的字符串没有限制。但是,如果没有将其格式化为相对路径,则会创建该条目,但是在提取zip归档文件的内容时可能会遇到异常。如果存档中已经存在具有指定路径和名称的条目,则创建具有相同路径和名称的第二个条目。
这里使用的是绝对路径:
var file = zip.CreateEntry(xml);
我的猜测是,当您尝试打开归档文件时,它无法静默地显示条目。
修改代码,使用不带路径的文件名:
var file = zip.CreateEntry(Path.GetFileName(xml));
作为一个单独的问题,请注意,您只是将文件名写入ZIP条目,而不是实际的文件。我猜你想要这样的东西:
var zipEntry = zip.CreateEntry(Path.GetFileName(xml));
using (var entryStream = file.Open())
{
using var fileStream = File.OpenRead(xml);
fileStream.CopyTo(entryStream);
}