Xamarin逆引きTips
Xamarin.iOSでZipファイルを使用するには?(ZipFileクラス編)
iOSアプリ開発標準のZipArchiveライブラリではなく、.NET標準のZipFileクラス編を使って、ZIPファイルの圧縮・展開を行う方法を解説する。
今回は、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 【コラム】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
3画面をレイアウトする
MainStoryboard.storyboard
ファイルを開いて、次のように画面をレイアウトする。
[圧縮]ボタンのNameはbuttonArchive
、[解凍]ボタンのNameはbuttonExtract
とする。
4ZIPファイルを作成する
ファイルを圧縮してZIPファイルを作成するには、ZipFileSample_TouchViewController.cs
ファイルを、以下のコードのように記述する。
……省略……
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
};
}
……省略……
}
}
|
1は、このサンプルで使用するディレクトリの取得処理だ。アプリケーションのデータディレクトリを使用している。これについては「Tips:Xamarin.iOS/Androidでアプリのデータディレクトリを取得するには?」を参照されたい。
2は、圧縮するためのテストファイルの作成処理だ。
/source
├ temp1
└ temp2
という構成でテストデータを作成している。
3が実際の圧縮処理だ。/source
ディレクトリ以下のファイル群から、MyArchive.zip
ファイルを作成する。
このプログラムを実行して、[圧縮]ボタンを押すと、データディレクトリにMyArchive.zip
ファイルが作成される。iOSシミュレーターであれば、Finderで実際にファイルが確認できるだろう。
5ZIPファイルを解凍する
4で作成したMyArchive.zip
ファイルを解凍するには、以下のように実装する。
……省略……
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ファイルの解凍処理も、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]を参照してください。
30. Xamarin.iOS/Androidでアプリの設定情報を保存するには?
iOSのNSUserDefaultsやAndroidのSharedPreferenceではなく.NETのIsolatedStorageを使って、Xamarin.iOS/Androidでアプリの軽量データを保存する方法を解説する。
31. Xamarin.AndroidでApplicationクラスを拡張するには?
Applicationクラスを拡張すると、アプリケーションイベントの発生時に独自の処理を実行したり、アプリケーションオブジェクトに機能を追加したりできる。その基本的な実装方法を解説する。
32. 【現在、表示中】≫ Xamarin.iOSでZipファイルを使用するには?(ZipFileクラス編)
iOSアプリ開発標準のZipArchiveライブラリではなく、.NET標準のZipFileクラス編を使って、ZIPファイルの圧縮・展開を行う方法を解説する。
33. Xamarin Studio/Visual Studioで「Ricty Diminished」プログラミング用フォントを使うには?
「Ricty Diminished」や「Source Code Pro」などのプログラミング用フォントを、Xamarin Studio/Visual Studioのコードエディターのフォントとして設定する方法。
34. Xamarin.FormsでBoxViewコントロールを拡張するには?
四角形を描画するBoxViewコントロールを拡張してネイティブ側で描画することで、角丸・枠線・影付きなどを実現する方法を説明する。