Подтвердить что ты не робот

Как избежать [Content_Types].xml в .net Класс ZipPackage

Я хочу знать, есть ли способ избежать наличия файла [Content_Types].xml внутри zip файла при использовании класса .net ZipPackage.. p >

4b9b3361

Ответ 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{}
        }
    }