Deep Insider の Tutor コーナー
>>  Deep Insider は本サイトからスピンオフした姉妹サイトです。よろしく! 
Xamarin逆引きTips

Xamarin逆引きTips

Xamarin.iOSでZipファイルを使用するには?(ZipFileクラス編)

2015年1月14日

iOSアプリ開発標準のZipArchiveライブラリではなく、.NET標準のZipFileクラス編を使って、ZIPファイルの圧縮・展開を行う方法を解説する。

奥山 裕紳(@amay077
  • このエントリーをはてなブックマークに追加

 今回は、Xamarin.iOSで、ZIPファイルの作成、あるいは解凍を行う方法を解説する。

 iOSアプリ開発でZIPファイルを扱うには、Objective-CではZipArchiveというライブラリを使用するのが一般的だ。

 Xamarin.iOSには、このライブラリを基に作成されたライブラリがXamarin Componentsで提供されており、こちらを使うこともできるが、.NET FrameworkにもZIPファイルを扱うZipFileクラス(System.IO.Compression名前空間)があるので、コードの共有を考えると、こちらを使った方がよいだろう。本稿ではZipFileクラスを使う方法を解説する。

1ソリューションとプロジェクトを作成する

 Xamarin Studioのメニューバーの[ファイル]-[新規]-[ソリューション]から表示したダイアログで、[C#]-[iOS]-[Unified API]*1-[iPhone]-[Single View Application]を選択し、プロジェクト名を「ZipFileSample.Touch」、ソリューション名を「ZipFileSample」として[OK]ボタンを押す。

図1 プロジェクトの作成

*1 【コラム】Xamarin.iOSのUnified APIについて

 Unified APIとは、Xamarin.iOSとXamarin.Mac、さらには32bitと64bitアプリケーションをサポートする共通のAPIだ。これまでのXamarin.iOSのAPIは「Classic API」と呼ばれ、32bit対応のみであった。Apple社が2015年2月よりiOSアプリの64bit対応を義務付けたことから、Xamarin.iOSでは今後、「Unified API」を使用することが事実上必須となる。本Tipsでも今後はUnified APIを使用したサンプルを提供していくつもりだ。

 Unified APIについての日本語の最新情報は、

を確認しておくとよいだろう。

2参照アセンブリを追加する

 メニューバーの[プロジェクト]-[参照アセンブリの編集]から表示したダイアログで、「Packages」タブを選択し、以下の2つのアセンブリにチェックを入れて[OK]を押す。

  • System.IO.Compression
  • System.IO.Compression.FileSystem
図2 参照アセンブリの編集

3画面をレイアウトする

 MainStoryboard.storyboardファイルを開いて、次のように画面をレイアウトする。

図3 画面のレイアウト

 [圧縮]ボタンのNameはbuttonArchive、[解凍]ボタンのNameはbuttonExtractとする。

4ZIPファイルを作成する

 ファイルを圧縮してZIPファイルを作成するには、ZipFileSample_TouchViewController.csファイルを、以下のコードのように記述する。

C#
……省略……
using System.IO;
using System.IO.Compression;

namespace ZipFileSample.Touch
{
  public partial class ZipFileSample_TouchViewController : UIViewController
  {
    ……省略……

    public override void ViewDidLoad()
    {
      base.ViewDidLoad();

      var dir = System.Environment.GetFolderPath(
        System.Environment.SpecialFolder.Personal); //<--1
      var sourceDir = Path.Combine(dir, "source");

      // テストデータの作成 //<--2
      Directory.CreateDirectory(sourceDir);
      var temp1 = File.CreateText(Path.Combine(sourceDir, "temp1.txt"));
      temp1.Write("temp1");
      temp1.Close();

      var temp2 = File.CreateText(Path.Combine(sourceDir, "temp2.txt"));
      temp2.Write("temp2");
      temp2.Close();

      // 圧縮
      buttonArchive.TouchUpInside += (sender, e) =>
      {
        ZipFile.CreateFromDirectory(sourceDir,
          Path.Combine(dir, "MyArchive.zip")); //<--3
      };
    }

    ……省略……
  }
}
ZIPファイルを作成する(ZipFileSample_TouchViewController.cs)

 1は、このサンプルで使用するディレクトリの取得処理だ。アプリケーションのデータディレクトリを使用している。これについては「Tips:Xamarin.iOS/Androidでアプリのデータディレクトリを取得するには?」を参照されたい。

 2は、圧縮するためのテストファイルの作成処理だ。

/source
├ temp1
└ temp2

という構成でテストデータを作成している。

 3が実際の圧縮処理だ。/sourceディレクトリ以下のファイル群から、MyArchive.zipファイルを作成する。

 このプログラムを実行して、[圧縮]ボタンを押すと、データディレクトリにMyArchive.zipファイルが作成される。iOSシミュレーターであれば、Finderで実際にファイルが確認できるだろう。

5ZIPファイルを解凍する

 4で作成したMyArchive.zipファイルを解凍するには、以下のように実装する。

C#
……省略……
using System.IO;
using System.IO.Compression;

namespace ZipFileSample.Touch
{
  public partial class ZipFileSample_TouchViewController : UIViewController
  {
    ……省略……

    public override void ViewDidLoad()
    {
      base.ViewDidLoad();

      var dir = System.Environment.GetFolderPath(
        System.Environment.SpecialFolder.Personal);
      var sourceDir = Path.Combine(dir, "source");

      ……省略……

      // 圧縮
      buttonArchive.TouchUpInside += (sender, e) =>
      {
        ZipFile.CreateFromDirectory(sourceDir,
          Path.Combine(dir, "MyArchive.zip"));
      };

      // 解凍
      buttonExtract.TouchUpInside += (sender, e) =>
      {
        ZipFile.ExtractToDirectory(
          Path.Combine(dir, "MyArchive.zip"),
          Path.Combine(dir, "extract")); //<--1
        };
      }
    }

    ……省略……
  }
}
ZIPファイルを解凍する(ZipFileSample_TouchViewController.cs)

 ZIPファイルの解凍処理も、1行のメソッド呼び出しで行える(1)。ここでは、MyArchive.zipファイルを、/extractディレクトリに解凍する。

 このプログラムを実行すると、以下のように/extractディレクトリにファイル群が作成される。

/extract
├ temp1
└ temp2

まとめ

 System.IO.Compression.ZipFileクラスを使用すると、簡単にZIPファイルを作成したり、解凍したりできる。System.IO.Compression名前空間には、関連するクラス群があるので、各自使用してみてほしい。

 他の選択肢としては、冒頭に紹介したXamarin ComponentsのZipArchiveの他、商用のライブラリもいくつか存在するようだ。コラムで紹介したように、今後はUnified API(64bit対応)が必須となるので、ライブラリの対応状況に注意する必要があるだろう。

※以下では、本稿の前後を合わせて5回分(第30回~第34回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

Xamarin逆引きTips
30. Xamarin.iOS/Androidでアプリの設定情報を保存するには?

iOSのNSUserDefaultsやAndroidのSharedPreferenceではなく.NETのIsolatedStorageを使って、Xamarin.iOS/Androidでアプリの軽量データを保存する方法を解説する。

Xamarin逆引きTips
31. Xamarin.AndroidでApplicationクラスを拡張するには?

Applicationクラスを拡張すると、アプリケーションイベントの発生時に独自の処理を実行したり、アプリケーションオブジェクトに機能を追加したりできる。その基本的な実装方法を解説する。

Xamarin逆引きTips
32. 【現在、表示中】≫ Xamarin.iOSでZipファイルを使用するには?(ZipFileクラス編)

iOSアプリ開発標準のZipArchiveライブラリではなく、.NET標準のZipFileクラス編を使って、ZIPファイルの圧縮・展開を行う方法を解説する。

Xamarin逆引きTips
33. Xamarin Studio/Visual Studioで「Ricty Diminished」プログラミング用フォントを使うには?

「Ricty Diminished」や「Source Code Pro」などのプログラミング用フォントを、Xamarin Studio/Visual Studioのコードエディターのフォントとして設定する方法。

Xamarin逆引きTips
34. Xamarin.FormsでBoxViewコントロールを拡張するには?

四角形を描画するBoxViewコントロールを拡張してネイティブ側で描画することで、角丸・枠線・影付きなどを実現する方法を説明する。

サイトからのお知らせ

Twitterでつぶやこう!