nsILocalFileからファイルシステムのディレクトリデリミタを得る方法

jarを自前で展開しようとして、ホストマシンのファイルシステムのディレクトリデリミタを得る必要があったので調べたけどわかんなかった。探してもぜんぜん書かれてないからパスのデリミタが知りたいっていう状況自体がなんか根本的に間違ってる気もするけど….

Google Code Search で探った結果 nsILocalFileWin とかを使うっぽい。いまやパスのデリミタが / じゃないのはWindowsだけ(iTunesで曲情報を見ると場所のところが : 区切りになってるけど内部的には今も : なんでしょうか?)なのでWindowsかどうかだけ判別できれば問題は解決するので

var is_windows = false;
try {
    // myabe same with: file.QueryInterface(Components.interfaces.nsILocalFileWin );
    is_windows = ( file instanceof Components.interfaces.nsILocalFileWin );
} catch ( e ) {
    trace(e);
}
var delimiter = (is_windows) ? '\\' : '/';

でデリミタを決定できる。
instanceofQueryInterfaceと違ってオブジェクトに変化を与えなそうなかんじだけど、呼び出し後ふつうにnsILocalFileWinになってたのでQueryInterfaceと変わんないのかな。それとも単にFirebugで見てるときにそう見えるだけ?どこ読んだら書いてあるのかがまだわかんない。

XUL Tutorial (XulPlanet.jp)に書いてあった。xulplanetに日本語訳があったなんて感動。いつかまじめに読みます。ここによると

オブジェクトに対し QueryInterface を呼び出したとき、要求したインターフェイスがオブジェクトでサポートされていない場合は例外( exception )が生じます。インターフェイスがコンポーネントでサポートされているかどうか不明な場合は、そのチェックに instanceof 演算子を使います

って書いてあって instanceofなら例外でないらしいんですけど nsILocalFileWin だからなのかバリバリ出ました。Windowsじゃないと Components.interfaces.nsILocalFileWin 自体がないとかいうわけではなくてinstanceofを呼んだときに

[Exception... "Could not convert JavaScript argument (NULL value cannot be used for a C++ reference type)" nsresult: "0x8057000b (NS_ERROR_XPC_BAD_CONVERT_JS_NULL_REF)" location: "JS frame :: file:///Users/kuma/.jsactions/global/jar.js :: <TOP_LEVEL> :: line 19" data: no] result=2153185291

っていうのが出ます。(on OSX)
なにがNULLなのかな….

あとおまけで Windows and .url files and nsILocalFileWinresolveShortcut でWindowsのショートカットファイルの解決ができたりしそうなことが書かれてたけどぜんぜんそんなメソッドは実装されていませんでした。


About this entry