<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>荒井省三のBlog : other</title><link>http://blogs.msdn.com/shozoa/archive/tags/other/default.aspx</link><description>Tags: other</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Dynamic Language SDK を使った ZIPアーカイブの使い方</title><link>http://blogs.msdn.com/shozoa/archive/2008/09/24/how-to-zip-archive-by-using-dynamic-language-sdk.aspx</link><pubDate>Wed, 24 Sep 2008 11:40:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8963252</guid><dc:creator>shozoa</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/shozoa/comments/8963252.aspx</comments><wfw:commentRss>http://blogs.msdn.com/shozoa/commentrss.aspx?PostID=8963252</wfw:commentRss><description>&lt;P&gt;C#などの言語でZIPアーカイブを取り扱うには、幾つかの方法があります。全てではないにしても、その代表的なものを以下に記載します。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;J#のZipライブラリを使用する。 
&lt;LI&gt;Windows Shell APIを使用する(COMを使うのが簡単)。 
&lt;LI&gt;フリーのライブラリを使用する(たとえば、&lt;A href="http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx" target=_blank mce_href="http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx"&gt;ここ&lt;/A&gt;など)。 
&lt;LI&gt;&lt;A href="http://www.madobe.net/archiver/index.html" target=_blank mce_href="http://www.madobe.net/archiver/index.html"&gt;統合アーカイバ プロジェクト&lt;/A&gt;のライブラリを使用する。 
&lt;LI&gt;市販のコンポーネントを使用する。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;これ以外にも、独自に作成したりと幾つかの方法を考えることができるでしょう。ここでは、&lt;A href="http://www.codeplex.com/sdlsdk" target=_blank mce_href="http://www.codeplex.com/sdlsdk"&gt;Silverlight Dynamic Language SDK&lt;/A&gt;で提供されるChiron.exeユーティリティを利用してみたいと考えています。Chiron.exeは、IronPython、IronRuby、Managed JScriptを使ってSilverlightアプリを開発する時に使用するユーティリティです。このユーティリティで「Chiron /z:app.xap /d:App」を実行することで、XAPファイルを作成することができます。XAPファイルは、ZIPアーカイブの拡張子をXAPにしただけのファイル・フォーマットです。つまり、Chiron.exeユーティリティの中にZIPアーカイブを扱うライブラリがあるわけです。このChiron.exeのソースコードもDynamic Language SDKで提供されています。これ以外にも、IronPython 2.0やIronRubyプロジェクトのソースコードにもChiron.exeのソースコードが含まれています。これらのプロジェクトで配布されているソースコードはライセンスがMS-PLですから、MS-PLを守ればソースコードを流用することも可能になっています。今回、利用するソースコードは、以下の2つです。&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Chiron\Zip.cs (ZIPアーカイバのメインソース) 
&lt;LI&gt;Chiron\Crc32.cs (CRC計算用のヘルパー)&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Zip.csには3つのクラスが定義されており、その中のZipArchiveクラスとZipArchiveFileクラスを利用します。ZipArchiveクラスが、Zipアーカイバそのものを扱うクラスであり、Zipアーカイバに含まれるエントリ(ファイル)がZipArchiveFileクラスのコレクションで扱います。つまり、ZipArchiveFileクラスがZipアーカイブに含まれる1エントリを扱うためのクラスになるのです。&lt;BR&gt;　ZipArchiveクラスを利用する上で、必ず守らなければならない手順があります。それは以下のようなものです。&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;ZipArchiveのインスタンス作成 
&lt;LI&gt;各種操作(アーカイバの作成や展開など) 
&lt;LI&gt;ZipArchive.Closeメソッドの呼び出し&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;　次に良く使用するだろうと考えられるメンバーを以下にまとめます。&lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=2 width=522 border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=201&gt;メンバー名&lt;/TD&gt;
&lt;TD class="" vAlign=top width=319&gt;
&lt;CENTER&gt;説　　　明&lt;/CENTER&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=201&gt;ZipArchive(string archivePath)&lt;/TD&gt;
&lt;TD class="" vAlign=top width=319&gt;コンストラクタで、読み取り専用のZIPアーカイブを開きます。&lt;BR&gt;archivePath：ZIPアーカイブのファイル名&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=201&gt;ZipArchive(string archivePath, FileAccess access)&lt;/TD&gt;
&lt;TD class="" vAlign=top width=319&gt;コンストラクタで、読み書き用(FileAccess.ReadWrite)にZIPアーカイブを開きます。&lt;BR&gt;archivePath：ZIPアーカイブのファイル名&lt;BR&gt;access：ファイルのオープンモード(FileAccess.ReadWriteを指定します)&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=201&gt;Countプロパティ&lt;/TD&gt;
&lt;TD class="" vAlign=top width=319&gt;ZIPアーカイブに含まれている要素数を戻します。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=201&gt;Filesプロパティ&lt;/TD&gt;
&lt;TD class="" vAlign=top width=319&gt;ZIPアーカイブに含まれているZipArchiveFileのコレクションを戻します。このコレクションを使うことで、ZIPアーカイブに含まれる様々な情報や個別の展開などを行うことができます。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=201&gt;CopyFromDirectory(string sourceDirectory, string targetDirectory)&lt;/TD&gt;
&lt;TD class="" vAlign=top width=319&gt;指定したフォルダからZIPアーカイブへ追加します。&lt;BR&gt;sourceDirectory：ZIPアーカイブへ追加するフォルダ&lt;BR&gt;tagetDirectory：ZIPアーカイブ上のルートフォルダを指定します。空文字は、ルート直下となります。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=201&gt;CopyToDirtectory(string sourceArchiveDirectory, string targetDirectory)&lt;/TD&gt;
&lt;TD class="" vAlign=top width=319&gt;ZIPアーカイブを指定したフォルダへ展開します。&lt;BR&gt;sourceArchiveDirectory：ZIPアーカイブ上の展開したいフォルダ名を指定します。空文字は、ルートとなり全てのエントリが展開されます。&lt;BR&gt;targetDirectory：展開先のフォルダを指定します。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=201&gt;CopyFromFile(string sourceFilePath, string targetArchivePath)&lt;/TD&gt;
&lt;TD class="" vAlign=top width=319&gt;ZIPアーカイブへ指定したファイルを追加します。&lt;BR&gt;sourceFilePath：ZIPアーカイブへ追加するファイルを指定します。&lt;BR&gt;targetArchivePath：ZIPアーカイブ内のフォルダを指定します。空文字は、ルートとなります。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=201&gt;CopyToFile(string sourceArchivePath, string targetFilePath)&lt;/TD&gt;
&lt;TD class="" vAlign=top width=319&gt;指定したZIPアーカイブのエントリを指定したファイルへ展開します。&lt;BR&gt;sourceArchivePath：ZIPアーカイブのエントリの名前のインデクサ(ZipArchiveFile.Name)です。&lt;BR&gt;targetFilePath：展開先のファイル名をフルパスで指定します。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=201&gt;Close()&lt;/TD&gt;
&lt;TD class="" vAlign=top width=319&gt;ZipArchiveクラスのインスタンスで使用したリソースを解放します。&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp; これ以外にもメンバーはありますが、この程度が頻繁に使うものだと考えられます。ZipArchiveクラスのエントリになるZipArchiveFileクラスから、様々な情報を取得することができます。その代表的なメンバーを以下に示します。&lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=2 width=520 border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=199&gt;メンバー名&lt;/TD&gt;
&lt;TD class="" vAlign=top width=319&gt;
&lt;CENTER&gt;説　　　　明&lt;/CENTER&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=199&gt;Nameプロパティ&lt;/TD&gt;
&lt;TD class="" vAlign=top width=319&gt;ファイル名で、フルパス(ZIPアーカイブをルートとしています)で表現されます。ファイル名だけを取得するには、パス区切りで分割などして取り出します。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=199&gt;Lengthプロパティ&lt;/TD&gt;
&lt;TD class="" vAlign=top width=319&gt;ファイルサイズです。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=199&gt;LastWriteTimeプロパティ&lt;/TD&gt;
&lt;TD class="" vAlign=top width=319&gt;ファイルの最終更新日です。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=199&gt;ReadAllText()メソッド&lt;/TD&gt;
&lt;TD class="" vAlign=top width=319&gt;テキストファイルの場合に、その内容を文字列で取得します。&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp; 後は圧縮されたサイズが参照したくなるかも知れませんが、ZipArchiveFileクラスで圧縮サイズを返すメンバーが用意されていません。このため自分で取得するメンバーを実装する必要があります(プライベート変数にcompressedDataが用意されているので、この変数のLengthなどを返すようにすれば取得することができます。もっともCopyFromFileメソッドを実行した直後は、compressedDataがnullになっていることに注意が必要です。&lt;/P&gt;
&lt;P&gt;　ここまでで必要になるクラスやメンバーの説明が完了しました。以下に新しいZIPアーカイブを作成するサンプルコードを提示します。&lt;BR&gt;&lt;PRE&gt;// 新規のアーカイブ作成
ZipArchive zipArchive = new ZipArchive(&lt;BR&gt;                        "アーカイブ名", FileAccess.ReadWrite);
// アーカイブへ指定フォルダを追加
zipArchive.CopyFromDirectory(&lt;BR&gt;                        "追加するフォルダ", "アーカイブ上のフォルダ名");
// アーカイブをクローズ
zipArchive.Close()
// アーカイブを開く
zipArchive = new ZipArchive("アーカイブ名");
// エントリを取得
foreach (ZipArchiveFile item in zipArchive.Files)
{
    // エントリの一覧などを処理する;
}
// アーカイブをクローズ
zipArchive.Close()
&lt;/PRE&gt;
&lt;P&gt;後は、説明したメンバーなどを活用すればZIPアーカイブに対する操作は一通りできるようになると思います。ここで使用したZipArchiveクラスでは、残念ながらパスワード付きZIPには対応していませんので、パスワード付きZIPを作成したい場合は、別の方法を使って下さい。&lt;/P&gt;
&lt;P&gt;最後に、Windows エクスプローラで作成したZIPアーカイブをZipArchiveクラスで扱う場合の注意点を以下に記します。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;ZipArchiveFile.Lengthプロパティがゼロのメンバーが存在します。&lt;/LI&gt;
&lt;LI&gt;ZipArcihveクラスは、ZipArchiveFile.Lengethプロパティのゼロを想定していませんので、エラーになります。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;この問題を回避する場合は、必要なメソッドに対処コードを追加する必要があります。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8963252" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/shozoa/archive/tags/other/default.aspx">other</category><category domain="http://blogs.msdn.com/shozoa/archive/tags/.NET/default.aspx">.NET</category></item><item><title>[other]Blogのコメント設定について</title><link>http://blogs.msdn.com/shozoa/archive/2007/07/12/other-blog.aspx</link><pubDate>Thu, 12 Jul 2007 06:02:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:3824051</guid><dc:creator>shozoa</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/shozoa/comments/3824051.aspx</comments><wfw:commentRss>http://blogs.msdn.com/shozoa/commentrss.aspx?PostID=3824051</wfw:commentRss><description>&lt;P&gt;不適切なトラックバックスパムがアメブロから何度か送られてきました。このためコメントの受け付けは、以下のように設定を変更しました。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;匿名コメントを許可&lt;/LI&gt;
&lt;LI&gt;承認後にコメントを公開&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;承認するまでコメントが公開されませんので、お手数ですがご了承をお願いいたします。不適切なトラックバックスパムなどで被害に合われた方が居ないとも限りませんので。。。(本当は、こんな設定にしたくないんですけど)&lt;/P&gt;
&lt;P&gt;PS:その後もアメブロから繰り返しトラックバックスパムが送られてきますので、ご注意ください。中には、ワンクリック詐欺へのリンクを持っているものもありますので。このブログでは、アメブロは100%のスパムサイトと評価しています。アメブロからのトラックバックは、無条件に削除します。正しく使っている方もいらっしゃると思いますが、その方たちには済みません。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=3824051" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/shozoa/archive/tags/other/default.aspx">other</category></item><item><title>Blogを始めました</title><link>http://blogs.msdn.com/shozoa/archive/2007/06/15/blog.aspx</link><pubDate>Fri, 15 Jun 2007 05:28:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:3303633</guid><dc:creator>shozoa</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/shozoa/comments/3303633.aspx</comments><wfw:commentRss>http://blogs.msdn.com/shozoa/commentrss.aspx?PostID=3303633</wfw:commentRss><description>&lt;P&gt;皆様、こんにちは。荒井でございます。&lt;BR&gt;今度から、msdnブログを始めました。まだ、どのような内容を記述していくかは、決めていませんが、その時々の情報をお知らせしていければと考えていますので、宜しくお願いいたします。&lt;BR&gt;&lt;BR&gt;取り急ぎ、ご挨拶まで。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=3303633" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/shozoa/archive/tags/other/default.aspx">other</category></item></channel></rss>