C# Zip解壓縮,規避 [content_types].xml 文件


使用 System.IO.Packaging.Package 進行壓縮和解壓時,會自動生成 [content_types].xml 文件。

The Structure of the [Content_types].xml File - Visual Studio | Microsoft Docs

壓縮時生成這個其實無所謂,但解壓文件時,也必須有這個文件的存在,否則不能解壓。這就不能忍了,畢竟不是所有的 Zip 壓縮包都會帶這個文件的。

怎么解?

System.IO.Compression.ZipFile

最簡單的方式,就是使用 System.IO.Compression.ZipFile 這個類,使用方式如下(示例):


        /// <summary>
        /// 解壓文件,這個方法不需要壓縮包中有 [Content_Types].xml 文件。
        /// </summary>
        public static IEnumerable<string> DecompressFileCompatibly(string target, string outPath)
        {
            ZipArchive zipArchive = ZipFile.Open(target, ZipArchiveMode.Read);

            // 獲取所有文件(相對路徑)
            var files = zipArchive.Entries.Select(e => e.FullName).ToList();

            // 解壓文件 (要求 outPath 不能存在,必須是全新的)
            zipArchive.ExtractToDirectory(outPath);

            // 返回的文件列表中,不需要有 [Content_Types].xml 文件。
            files.Remove("[Content_Types].xml");

            // 最終解壓出來的所有文件
            var fileList = files.Where(f =>
            {
                var file = Path.Combine(outPath, f);
                return File.Exists(file); // 過濾文件夾
            }).Select(f => Path.Combine(outPath, f)).ToList();

            return fileList;
        }

其它方式

也可以使用第三方庫處理這個問題,如:

SharpZipLib | #ziplib is a Zip, GZip, Tar and BZip2 library written entirely in C# for the .NET platform.
DotNetZip Library - CodePlex Archive

參考資料:
how to avoid [Content_Types].xml in .net's ZipPackage class - Stack Overflow


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM