使用 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