FileSystemObject(以下、FSO)は便利だ。しかし、FSOはサブフォルダやファイルリストを取得するときに、CollectionというVBのForEachでないと上手く扱えない形式で返してくるので、javascriptでそれを扱うのは少し面倒である。
それを少しは楽にするのが以下のスニペット。
function $E(obj) { var a=[]; for(var e=new Enumerator(obj); !e.atEnd(); e.moveNext()){ a.push(e.item()); } return a; } Array.prototype.each = function(f){ for(var i=0; i<this.length; i++){ f(this[i]); } };
上のコードを読み込んでおけば、
$E(コレクション).each(function(i) { // iを使って何かする });
という書き方ができるようになる。
例えばカレントディレクトリ内の各ファイルに対して何かする処理を素直に書くと、以下の様にEnumeratorを通して1件ずつ取得して扱うことにになる。
var e = new Enumerator(fso.GetFolder(".").Files); for (e.moveFirst(); !e.atEnd(); e.moveNext()) { var file = this.item(); // fileを使って何かする }
ちなみに、VBScriptだと簡単だ。
For Each file In fso.GetFolder(".").Files ' fileを使って何かする Next
上記は単にファイル一覧を取得したいだけなのに、特殊な動きでキモチワルイため最初のスニペットを作ってみた。
これでjQueryやprototype.jsでお馴染みの「$(xxx).each(function(i){ });」形式で呼び出せるようになる。
$E(fso.GetFolder(".").Files).each(function(file) { // fileを使って何かする });
ちょっとは直感的になったんじゃなかろうか。