Я хочу знать, есть ли способ избежать наличия файла [Content_Types].xml внутри zip файла при использовании класса .net ZipPackage.. p >
Как избежать [Content_Types].xml в .net Класс ZipPackage
Ответ 1
Нет.
Почтовые пакеты не являются (обычными) Zip файлами. Они должны следовать установленной структуре и содержать этот файл Content_Types.xml
в корне. ZipPackage = ZipArchive + Structure
.
Если вы хотите создать (и особенно если хотите читать) нормальные Zip-архивы, вам понадобится дополнительная библиотека, в BCL не будет поддержки.
См. SharpZipLib (GPL) и DotNetZip
Ответ 2
Если вы не вызываете метод .Flush(), такого файла не будет
Ответ 3
Да, вы можете создавать пакеты zip без добавления дополнительного файла содержимого XML
Вдохновлен этой ссылкой: Использование System.IO.Packaging для создания ZIP файла
Используя вышеупомянутое открытие, упомянутое 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 it. Zip file saved to file. Things added by package after this point will be to memory stream finally disposed.
}
}
}
Ответ 4
Мужчина, это мне очень помогло! Ты жжешь! Мне пришлось использовать это, потому что моя прежняя структура (3.5). Только для дополнения см. Ниже реализацию функции CopyStream: private void CopyStream(Stream source, Stream target)
{
const int bufSize = 0x1000;
byte[] buf = new byte[bufSize];
int bytesRead = 0;
while ((bytesRead = source.Read(buf, 0, bufSize)) > 0)
target.Write(buf, 0, bytesRead);
}
Ответ 5
Вы также можете установить частное поле _contentTypeHelper
от System.IO.Packaging.Package
до null
(используя DynamicObject
).
Ответ 6
Запустите эту функцию, когда закончите упаковывать ваш zip файл:
public static void Remove_Content_Types_FromZip(string zipFileName)
{
string contents;
using (ZipFile zipFile = new ZipFile(File.Open(zipFileName, FileMode.Open)))
{
/*
ZipEntry startPartEntry = zipFile.GetEntry("[Content_Types].xml");
using (StreamReader reader = new StreamReader(zipFile.GetInputStream(startPartEntry)))
{
contents = reader.ReadToEnd();
}
XElement contentTypes = XElement.Parse(contents);
XNamespace xs = contentTypes.GetDefaultNamespace();
XElement newDefExt = new XElement(xs + "Default", new XAttribute("Extension", "sab"), new XAttribute("ContentType", @"application/binary; modeler=Acis; version=18.0.2application/binary; modeler=Acis; version=18.0.2"));
contentTypes.Add(newDefExt);
contentTypes.Save("[Content_Types].xml");
zipFile.BeginUpdate();
zipFile.Add("[Content_Types].xml");
zipFile.CommitUpdate();
File.Delete("[Content_Types].xml");
*/
zipFile.BeginUpdate();
try
{
zipFile.Delete("[Content_Types].xml");
zipFile.CommitUpdate();
}
catch{}
}
}