ZipPackageクラスの使い方は?

解決


プリングルス  2009-07-14 21:58:25  No: 146077  IP: 192.*.*.*

.NET Framework 3.0に、ZipPackageというものがあるとのことなので、圧縮・解凍を行えるようなプログラムを作りたいのですが、
ZipPackageの使い方などがよく分かりません。
Microsoftのサイトを見に行きましたが、以下のパッケージの書き込みのサンプルというページ
http://msdn.microsoft.com/ja-jp/library/ms771376.aspx
のどこにサンプルがあるのか全く分かりません。
こちらが知りたいのは、
・zipファイルの作成方法
・作成したzipファイルの中のファイルへのアクセス方法
です。
どなたか解説をお願い頂けませんでしょうか?
よろしくお願いします。

編集 削除
Hongliang  2009-07-14 22:04:43  No: 146078  IP: 192.*.*.*

ZipPackage は一般的な Zip ファイル操作ライブラリではありません。Open Packaging Conventions 仕様に基づくパッケージングのためのライブラリです。ファイルを作成したときは普通の Zip ファイルとしては余計なものが追加されますし、普通の Zip ファイルの中を見ることもできません。
// と以前よそで答えた内容をコピペ。
ちなみに、WPF でサポートされてる XPS ドキュメントとかで利用されます。

編集 削除
80575561  2009-07-14 22:08:16  No: 146079  IP: 192.*.*.*

真ん中らへんに「Download sample」ってあるね
中見てみたけどC#のプロジェクトが入ってたよ

大して長いコードでもないから一度読んでみるといいよ

編集 削除
プリングルス  2009-07-14 22:59:33  No: 146080  IP: 192.*.*.*

Hongliangさん、ありがとうございます。
とりあえずは、普通に作成したzipファイルをこれで解凍することはないので今は問題ありません。

80575561さん、ありがとうございます。
C#のサンプルで、PackageRelationshipTypeとResourceRelationshipTypeという定数があるのですが、これの意味がわかりません。

private const string PackageRelationshipType =
    @"http://schemas.microsoft.com/opc/2006/sample/document";
private const string ResourceRelationshipType =
    @"http://schemas.microsoft.com/opc/2006/sample/required-resource";
(途中略)
package.CreateRelationship(packagePartDocument.Uri,
                           TargetMode.Internal,
                           PackageRelationshipType);
(途中略)
packagePartDocument.CreateRelationship(
                        new Uri(@"../resources/image1.jpg",
                        UriKind.Relative),
                        TargetMode.Internal,
                        ResourceRelationshipType);

これは何を意味しているのでしょうか?

編集 削除
プリングルス  2009-07-14 23:27:09  No: 146081  IP: 192.*.*.*

このC#のサンプルの中で、もうひとつ分からないことがあります。
ファイルのストリームをpackagePartに書き込んでいるところがありますが、
CopyStream(fileStream, packagePartDocument.GetStream());

この関数は、以下のようになっています。
private static 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);
}// end:CopyStream()

この関数の引数のtargetには、packagePartDocument.GetStream()が当てられていますが、
packagePartDocument.GetStream()はpackagePartのストリームを返すメソッドです。
しかし、上記関数はこのストリームにソースファイルのストリームを書き込んでいますが、
これはpackagePartDocument.GetStream()のアドレスに書き込んでいるということなのでしょうか?
こんなこと、VBでもできるのでしょうか?

編集 削除
オショウ  2009-07-14 23:32:07  No: 146082  IP: 192.*.*.*

J#のvjslib.dllを参照設定すれば、できます。

http://dobon.net/vb/dotnet/links/createzipfile.html

以上。参考まで・・・

編集 削除
Hongliang  2009-07-14 23:48:13  No: 146083  IP: 192.*.*.*

> C#のサンプルで、PackageRelationshipTypeとResourceRelationshipTypeという定数があるのですが、これの意味がわかりません。
http://msdn.microsoft.com/ja-jp/library/ms580582.aspx
の解説に書かれていますが、要はそのリレーションシップがどんな種類なのかを URI 形式で定義するものです。
URI とリレーションシップの種類の対応はパッケージを使う形式次第です。XPS については上記リンクにありますね。
サンプルの場合はサンプルなので URI に sample が入ってるように適当な URI になっています。変数名通り、パッケージを表すリレーションシップと、リソースを表すリレーションシップってことですね。

> この関数の引数のtargetには、packagePartDocument.GetStream()が当てられていますが、
> packagePartDocument.GetStream()はpackagePartのストリームを返すメソッドです。
> しかし、上記関数はこのストリームにソースファイルのストリームを書き込んでいますが、
> これはpackagePartDocument.GetStream()のアドレスに書き込んでいるということなのでしょうか?
アドレスというか、ストリームにですね。

> こんなこと、VBでもできるのでしょうか?
もちろんです。というかなぜできないと思ったのでしょう。
// まあ文法の都合上による多少の書き換えは必要ですが。

編集 削除
YuO  2009-07-15 00:25:38  No: 146084  IP: 192.*.*.*

# MS調布でOOXMLの説明聴いたときの資料どっかいった……。


> C#のサンプルで、PackageRelationshipTypeとResourceRelationshipTypeという定数があるのですが、これの意味がわかりません。

OPCで利用するXMLファイル (.rels等) のXML名前空間です。
たとえば,.xlsxのルートの.relsでは,名前空間としてhttp://schemas.openxmlformats.org/package/2006/relationshipsを使っています。
# 当然,その名前空間を使った場合の意味合いについての定義は通常別にあるのですが。


> この関数の引数のtargetには、packagePartDocument.GetStream()が当てられていますが、
> packagePartDocument.GetStream()はpackagePartのストリームを返すメソッドです。
> しかし、上記関数はこのストリームにソースファイルのストリームを書き込んでいますが、
> これはpackagePartDocument.GetStream()のアドレスに書き込んでいるということなのでしょうか?

正確に言うと,GetStreamはストリームオブジェクトを返します。
で,CopyStreamは入力ストリームからバイト列を読み取って,出力ストリームに読み取ったバイト列を書き出しているだけです。
ストリームをストリームに書き込んでいるわけではありません。


> こんなこと、VBでもできるのでしょうか?

当然,可能です。

編集 削除
プリングルス  2009-07-15 08:00:01  No: 146085  IP: 192.*.*.*

みなさま、解説ありがとうございました。
色々と調べてみます。

編集 削除