実際に wasavi 上のファイルシステムの1つとして組み込む。
のだが、その前に、ファイルの読み書きの他にもう一つコマンドが必要だ。それは任意のディレクトリ内のファイル群のリストで、いわゆる ls だ。これは wasavi では tab キーによるファイル名の補完時に呼ばれる。ls 的な処理を書いていて、いくつか奇妙なことに気がついた。
Chrome の filesystem API でそれを行うには、
- ルートとなる directoryEntry から、任意のパスへの directoryEntry を得る
- 得た directoryEntry の createReader() を呼び出す
- 得た DirectoryReader インスタンスの readEntries() を複数回呼び出す。
という処理を行う必要がある。
このとき、1. がなんだか奇妙だ。
rootEntry.getDirectory(
'', // path
{}, // options
function (dir) {
// success callback
},
function (err) {
// error callback
}
);
のうち、path。これは絶対パスか、相対パスを指定すると定義されている。rootEntry の実体が [cci]/home/akahuku[/cci] だったとして、例えばその中の [cci]bin[/cci] ディレクトリの下のファイルリストを取りたい場合、
- bin
- ./bin
- /bin
いずれでも同じ結果が返るはずである。しかし、Chrome の実装では絶対パスを与えるとエラーになる。確かに、そもそもこの文脈での絶対パスというものの定義がよく分からない。結局のところ rootEntry からの相対パスとして扱えばいいのか、実際のファイルシステム上の絶対パスとして扱うべきものなのか W3C の仕様定義には書いてない。うーん?
もうひとつ、fileEntry や directoryEntry の親である fullPath プロパティもなんか変。上記の通り [cci]/home/akahuku[/cci] に対応する directoryEntry の fullPath を参照すると、[cci]/akahuku[/cci] なのである。…なんで? 仕様定義では、このプロパティは
The full absolute path from the root to the entry.
である。つまり [cci]/[/cci] じゃないとおかしい。
このへんの辻褄を何とか合わせる必要がある。