Какова цель отношений пакета в .NET? - PullRequest
6 голосов
/ 12 декабря 2010

Что такое пакетная связь (ZipPackage) в .NET?Я знаю, что такое Пакет, но у меня возникают проблемы с пониманием цели отношений.Не могли бы вы привести примеры, когда я хотел бы использовать их и для чего они хороши?

Ответы [ 3 ]

1 голос
/ 12 декабря 2010

С MSDN (класс пакета):

Пакет - это абстрактный класс, который можно использовать для организации объектов в единый объект определенного физического формата для переносимости и эффективного доступа.

И

PackageRelationship («отношение») определяет связь между исходным пакетом или PackagePart и целевым объектом. PackageRelationship может быть одного из двух типов, каждый из которых может иметь одну из двух форм:

* A package-level relationship (created by the Package.CreateRelationship method) relates a Package to either:
      o A target part in the package.
      o A target resource outside the package.
* A part-level relationship (created by the PackagePart.CreateRelationship method) relates a source PackagePart to either:
      o Another target part in the package.
      o A target resource outside the package.

Итак, при создании Package, если вы хотите указать, что существует связь между объектом и другой частью пакета, вы должны использовать PackageRelationship, чтобы указать, какие это отношения.

A ZipPackage также можно использовать для работы с файлами Open Office XML - в этом случае иногда полезно указывать отношения объектов друг с другом. Смотрите здесь .

0 голосов
/ 23 августа 2018

На мой взгляд, хорошими примерами являются все форматы файлов, использующие OPC

И пример в c # для контейнера opc с изображением предварительного просмотра будет реализован f.e.:

using System.IO.Compression;
using System.IO.Packaging;

using (var package = Package.Open( your_Zip/OPC_File_Path, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
    // Add the Preview Image to the OPC container
    var imagePart = package.CreatePart( PackUriHelper.CreatePartUri(new Uri("preview.png", UriKind.Relative)), "image/png");
    package.CreateRelationship( imagePart.Uri, TargetMode.Internal, OpcConstants.RelationshipTypes.PREVIEWIMAGE, "preview");

    using(var imageStream = imagePart.GetStream( FileMode.Open, FileAccess.Write ))
    {
        imageStream.Write( your_preview_Image_Byte_array, 0, your_preview_Image_Byte_array.Length);
    }
}


   private byte[] GetPreviewImage(System.IO.Packaging.Package package)
   {
        if (!package.RelationshipExists("preview"))
        {
            return null;
        }

        var previewRel = package.GetRelationship("preview");
        var previewUri = PackUriHelper.CreatePartUri(previewRel.TargetUri);

        var previewImagePart = package.GetPart(previewUri);
        using (var previewImageStream = previewImagePart.GetStream(FileMode.Open, FileAccess.Read))
        using (var ms = new MemoryStream())
        {
            previewImageStream.CopyTo(ms);
            return ms.ToArray();
        }
    }

И чтобы преобразовать ваш png в байтовый массив, вы можете сделать this

Таким образом, вы могли бы получить выгоду, после чего вы могли бы использовать свой определенный Relationship-Id (= "preview") для доступа к вашему previewImage в контейнере opc

0 голосов
/ 12 декабря 2010

По сути, это соединять вещи друг с другом, чтобы они были развернуты и, что более важно, одновременно развернуты.

Скажем, например, у вас есть программа и у вас есть пакет GIF-файлов, которые она использует,Затем вы хотите, чтобы GIF-файлы были доступны при установке вашей программы, и вы хотите, чтобы они были очищены при удалении программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...