我想知道在使用.Net的ZipPackage类时,是否有任何方法可以避免在压缩文件中包含Content_Types.xml文件。
发布于 2010-09-20 17:31:37
不是的。
Zip包不是(普通) Zip文件。它们必须遵循强制结构,并在根目录中包含该Content_Types.xml
文件。ZipPackage = ZipArchive + Structure
。
如果你想创建(尤其是如果你想要阅读)普通的Zip压缩文件,你将需要一个额外的库,在BCL中没有支持。
请参阅SharpZipLib (GPL)和DotNetZip
发布于 2015-02-05 17:55:09
如果不调用.Flush()方法,就不会有这样的文件
发布于 2016-03-27 07:35:08
是,您可以在不添加额外XML内容文件的情况下创建压缩包
灵感来自这个链接:Using System.IO.Packaging to generate a ZIP file
使用Yiping提到的上述发现,您可以避免将额外的xml文件添加到包中。在关闭zip存档之前,将内存流中的zip流保存到物理zip文件中,如下所示:
public static void AddFilesToZip(string zipFilename, List<String> filesToAdd)
{
using (var memStream = new MemoryStream())
{
using (Package zip = System.IO.Packaging.Package.Open(memStream, FileMode.Create))
{
foreach (var fileToAdd in filesToAdd)
{
string destFilename = ".\\" + Path.GetFileName(fileToAdd);
Uri uri = PackUriHelper.CreatePartUri(new Uri(destFilename, UriKind.Relative));
//Existing parts not likely in fresh memory stream
if (zip.PartExists(uri))
{
zip.DeletePart(uri);
}
PackagePart part = zip.CreatePart(uri, "", CompressionOption.Normal);
using (FileStream fileStream = new FileStream(fileToAdd, FileMode.Open, FileAccess.Read))
{
using (Stream dest = part.GetStream())
{
CopyStream(fileStream, dest);
}
}
}
//The zip Package will add an XML content type file to memeory stream when it closes
//so before it closes we save the memorystream to physical zip file.
using (FileStream zipfilestream = new FileStream(zipFilename, FileMode.Create, FileAccess.Write))
{
memStream.Position = 0;
CopyStream(memStream, zipfilestream);
}
// That's it. Zip file saved to file. Things added by package after this point will be to memory stream finally disposed.
}
}
}
https://stackoverflow.com/questions/3748970
复制相似问题