File I/O APIの詳細

Dev.Operaに投稿された文書をざっと見てみると、OperaWeb標準化を申請しているFile I/O APIは、かなり自由にローカルのファイル操作ができるらしい。

File I/O APIというのは前にも書いたように、JavaScriptからローカルのファイルの読み書きを実現する画期的なAPIのことだ。Operaはこれを使ってOpera WidgetをもっとGoogle GadgetやMacDashboard Widgetのようなものにしたいらしい。


以降はFile I/O API - Opera Developer Communityの要約(よりもっと簡単な意訳)。

さらに詳しい仕様はFile I/Oにある(が、まだ草稿段階らしいので将来変わる可能性はある)。

File I/O APIは、FileSystem、File、FileStreamの3つのクラスから成っている。

FileSystemクラス

ローカルのファイルを参照するにはまず、

opera.io.filesystem.browseForDirectory( )

opera.io.filesystem.browseForFile( )

という関数を使ってユーザー自身にマウントポイントを指定させる。マウントポイントはFileSystemというクラスに属する。これらの関数が取る引数は、マウントポイントの名前(スクリプト側から呼び出すときの名前)や、そのマウントポイントに対して行う操作などを書く。

その後そのマウントポイントを呼び出す時は

opera.io.filesystem.mountPoints

を使う。

マウントポイントは仮想的なファイルシステムとして扱われ、ファイル操作や権限などはUNIX系のファイルシステムとほぼ同じである。


マウントポイントにはURLが与えられ、例えばmyImagesと名付けられたディレクトリを指して

<img src="mountpoint://myImages/avatar.png">

というふうにHTMLから使うことができる。

特別な種類のマウントポイントとして、applicationとstorageというディレクトリがあるとも書いてあるのだが、よく意味が解らないので引用だけ。

Special mount points: the application and storage directories
There are two special directories you can use with the File I/O API:

  • The application directory, which contains the actual files in the application accessing the file system. If the application is a widget, this directory will contain all the files in the widget, like config.xml, index.html and others. This directory is always mounted as readonly.
  • The private storage directory which can be used to save files specific to the application. The files stored in this directory persist until the application is uninstalled.

Fileクラス

マウントポイントの中の各ファイルはFileというクラスになる。ファイルオブジェクトはマウントポイントを起点「/」としたパスで表され、関数resolve( )を使って与えられる。下はマウントポイント"mp"の中のあるパスにあるファイルを"file"というファイルオブジェクトに与える例。

var file = mp.resolve('path/to/my/file');

ファイルオブジェクトは次のようなプロパティを持つ。

  • exists
    • Check if the file referenced by this File object actually exists. Especially -useful when using the resolve() method.
  • isFile
    • If the File object references a regular file.
  • isDirectory
    • If the File object references a directory.
  • created
    • When the file was created.
  • modified
    • When the file was last modified.
  • path
    • The path to this file in the virtual file system, starting with '/' and the name of the mount point.

上の引用にもあるとおり、ディレクトリもファイルオブジェクトのひとつであり、refresh( )という関数を使ってそのディレクトリ以下のファイルをアクセス可能にすることができる。以下は"dir"というディレクトリの中のファイルをロードしている例。

dir.refresh(); //Load the contents of the directory
for ( var i = 0, file; file = dir[i]; i++ )
{
  opera.postError(file.path + ' ' + file.isDirectory + ' ' file.isFile);
}

FileStreamクラス

ファイルの読み書きはFileStreamというクラスを使って行う。

var stream = dir.open('newfile', 'w');
stream.writeLine('hello');
stream.close();
stream = dir.open('newfile');
var data = stream.readLine();
opera.postError(data);

上の例では

  1. "dir"ディレクトリの中に"newfile"というファイルを書き込み可能な権限で作り、
  2. その中に"hello"という行を付け加え、
  3. そのファイルを閉じ、
  4. そのファイルの中の一行(つまり先に書いた行)を"data"という変数に割り当てる。

ということを"stream"という変数を使って行っている。

権限はUNIX系のファイルシステムを扱うことに慣れていたら簡単に理解出来る。

  • r
    • Open for reading only; place the file pointer at the beginning of the file.
  • r+
    • Open for reading and writing; place the file pointer at the beginning of the file.
  • w
    • Open for writing only; place the file pointer at the beginning of the file and truncate the file to zero length. If the file does not exist, attempt to create it.
  • w+
    • Open for reading and writing; place the file pointer at the beginning of the file and truncate the file to zero length. If the file does not exist, attempt to create it.
  • a
    • Open for writing only; place the file pointer at the end of the file. If the file does not exist, attempt to create it.
  • a+
    • Open for reading and writing; place the file pointer at the end of the file. If the file does not exist, attempt to create it.

気になった点

  • File I/Oを有効にするにはOpera Widgetのconfig.xmlの中で"file"属性を"yes"にする必要があると書いてある。Operaの本体からはFile I/O APIは使えないのだろうか?
  • マウントポイントに(フォルダではなく)ファイルを指定した場合はそれはFile I/O APIからも単一のファイルとして見えるのだろうか?そこのところがあまりはっきりしない。
  • どうもOperaはブラウザ本体では「標準」に縛られてあまりダイナミックな変更ができない代わりに、ウィジェットを使って本体の機能を補おうとしているようにも思える。
  • File I/O APIJavaScriptからローカルファイルを操作するという点では革新的な技術だが、ウィジェットとして考えてみると、これで他のウィジェットサービスに並ぶだけに過ぎない。(やはりブラウザ本体からウィジェットにデータを受け渡しできるAPIが必要ではないか?自分の知る限りこういうことはできない気がする。)


このFile I/O APIは9.50betaよりもさらに実験的なバージョンのOperaで試すことができる。ダウンロードは↓


こちらにはドキュメンテーションやライブラリなどがダウンロードできるリンクがある。