how to avoid [Content_Types].xml in .net's ZipPackage class
No.
Zip Packages are not (normal) Zip files. They must follow an imposed structure and contain that Content_Types.xml
file in the root. ZipPackage = ZipArchive + Structure
.
If you want to create (and especially if you want to read) normal Zip archives you will need an extra library, there is no support in the BCL.
See SharpZipLib (GPL) and DotNetZip
If you don't call the .Flush() method, there will be no such file
Yes you can create zip packages without the extra XML content file added
Inspired by this link: Using System.IO.Packaging to generate a ZIP file
Using above discovery mentioned by Yiping you can avoid the extra xml file added into the package. Save zip stream from memory stream to a physical zip file before zip archive is closed like this:
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.
}
}
}