Adobe AIRで作るデスクトップアプリケーション

第7回 ファイルシステムAPI(その1)

この記事を読むのに必要な時間:およそ 4 分

ファイルやディレクトリの情報を調べる

Fileオブジェクトが参照しているファイルやディレクトリに関する情報は,Fileクラスのプロパティで調べられます。以下が代表的なものです。

name:String名前
size:Numberサイズ(byte)
extension:String拡張子
creationDate:Date 作成日時
modificationDate:Date最終更新日時
isHidden:Boolean不可視かどうか
isDirectory:Booleanディレクトリかどうか
icon:Icon関連付けされているアイコン
exists:Boolean存在するかどうか

iconプロパティは少し特殊なので説明しておきます。これはファイルアイコンやフォルダアイコンをBitmapDataオブジェクトで取得できるプロパティです。値となるIconオブジェクトは,アイコンデータに含まれる複数のイメージをbitmapsというプロパティに配列として保持しています。次のコードではAIRファイルのアイコンをステージに並べています。

var file:File = File.desktopDirectory.resolve("sample.air");
var images:Array = file.icon.bitmaps;
var xpos:uint = 0;
for (var i:uint = 0; i < images.length; i++) {
	var bmp:Bitmap = new Bitmap(images[i]);
	bmp.x = xpos;
	xpos += bmp.width;
	window.stage.addChild(bmp);
}

ファイルやフォルダのアイコンを取得できる

ファイルやフォルダのアイコンを取得できる

同期メソッドと非同期メソッド

Fileオブジェクトにファイルやディレクトリを指定したら,それに対してコピーや移動,削除といった操作ができます。これらの操作を行うメソッドの多くに,同期バージョンと非同期バージョンがあります。例えば,同期メソッドのcopyTo()と非同期メソッドのcopyToAsync()は,どちらもファイルやディレクトリをコピーするためのメソッドです。

同期メソッドの場合,ファイル操作が完了してから次の処理に移ります。処理の流れが分かりやすく,コードがシンプルになるのが利点ですが,ファイル操作に時間がかかると他の処理が止まってしまいます。したがって,ファイルサイズが比較的小さく,処理がすぐ終わる場合に向いています。

非同期メソッドの場合,ファイル操作を行いながらバックグラウンドで他の処理も進行するので,プログレス表示なども行えます。ファイルサイズが大きい場合や不明な場合は非同期メソッドを使ったほうがよいでしょう。ファイル操作の完了やエラーはイベントによって通知されます。

ファイルやディレクトリのコピー,移動

ファイルやディレクトリのコピーや移動を行うには,Fileクラスの以下のメソッドを使います。

同期メソッド非同期メソッド
ファイルやディレクトリをコピーcopyTo()copyToAsync()
ファイルやディレクトリを移動moveTo()moveToAsync()

コピーと移動はメソッド名が違うだけで,使い方は同じです。まずは同期メソッドから見ていきましょう。次のコードはcopyTo()メソッドを使ってファイルをコピーする例です。

var file1:File = File.documentsDirectory.resolve("sample.txt");
var file2:File = File.desktopDirectory.resolve("sample.txt");
try {
	file1.copyTo(file2, true);
} catch (error:IOError) {
	trace(error.message);
}

このように,コピー元のFileオブジェクトに対してcopyTo()を実行し,コピー先を示すFileオブジェクトを引数として渡します。copyTo()の2番目の引数は上書きフラグです。trueを指定すると既存のファイルに上書きコピーします。上書きフラグがfalse(デフォルト値)の場合にコピー先ファイルが存在すると,IOErrorがスローされます。コピー元のファイルが無い場合や,使用中のファイルに上書きしようとした場合などもエラーとなります。

次に非同期メソッドを使った方法を見てみましょう。次のコードはcopyToAsync()メソッドを使ってファイルをコピーする例です。メソッドの使い方はcopyTo()と変わりませんが,イベントリスナーを登録してコピーの完了通知やエラー通知を受け取る点が異なります。

var file1:File = File.documentsDirectory.resolve("sample.txt");
var file2:File = File.desktopDirectory.resolve("sample.txt");
file1.addEventListener(Event.COMPLETE, onFileCopyComplete);
file1.addEventListener(IOErrorEvent.IO_ERROR, onFileCopyError);
file1.copyToAsync(file2, true);

private function onFileCopyComplete(event:Event):void {
	trace("コピー完了");
}
private function onFileCopyError(event:IOErrorEvent):void {
	trace("I/Oエラー");
}

著者プロフィール

タナカヤスヒロ

早稲田大学卒業後,DTP業務を経てマルチメディア系制作会社へ。Macromedia Directorにのめり込む。フリーランスとなりFlashにシフトしてからもデスクトップ絡みの仕事が絶えず,Apolloにも勝手に縁を感じている。現在株式会社antsに所属。ants Lab.にも記事を上げている。

URLhttp://labs.anthill.jp/

著書