首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在.Net的ZipPackage类中避免[Content_Types].xml

如何在.Net的ZipPackage类中避免[Content_Types].xml
EN

Stack Overflow用户
提问于 2010-09-20 13:55:18
回答 6查看 13.9K关注 0票数 19

我想知道在使用.Net的ZipPackage类时,是否有任何方法可以避免在压缩文件中包含Content_Types.xml文件。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-09-20 17:31:37

不是的。

Zip包不是(普通) Zip文件。它们必须遵循强制结构,并在根目录中包含该Content_Types.xml文件。ZipPackage = ZipArchive + Structure

如果你想创建(尤其是如果你想要阅读)普通的Zip压缩文件,你将需要一个额外的库,在BCL中没有支持。

请参阅SharpZipLib (GPL)和DotNetZip

票数 9
EN

Stack Overflow用户

发布于 2015-02-05 17:55:09

如果不调用.Flush()方法,就不会有这样的文件

票数 4
EN

Stack Overflow用户

发布于 2016-03-27 07:35:08

是,您可以在不添加额外XML内容文件的情况下创建压缩包

灵感来自这个链接:Using System.IO.Packaging to generate a ZIP file

使用Yiping提到的上述发现,您可以避免将额外的xml文件添加到包中。在关闭zip存档之前,将内存流中的zip流保存到物理zip文件中,如下所示:

代码语言:javascript
复制
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.
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3748970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档