WSH/JScriptを使って再帰的にファイル一覧を列挙したい場面があるので、ファイル一覧を文字列の配列として取得する関数を作ってみました。
// 指定パス以下のファイル全部を配列形式で取得する
function enumFiles(target) {
var fso = new ActiveXObject("Scripting.FileSystemObject");
if (fso.FileExists(target)) {
return [target];
}
if (!fso.FolderExists(target)) return [];
var result = [];
// 指定パスのファイル一覧を得る
var dir = fso.GetFolder(target);
// ファイルを一つずつ処理する
var e = new Enumerator(dir.Files);
for ( ; !e.atEnd(); e.moveNext()) {
var file = e.item();
result.push(file.Path);
}
// 再帰的にディレクトリを処理する
e = new Enumerator(dir.SubFolders);
for ( ; !e.atEnd(); e.moveNext()) {
var r = enumFiles(e.item());
result = result.concat(r);
}
return result;
}
また、ファイル一覧に対して、関数callbackを実行する関数は以下のように定義してみました。
// ファイル一覧を巡回
function enumFiles(target, callback) {
var fso = new ActiveXObject("Scripting.FileSystemObject");
if (fso.FileExists(target)) {
callback(fso.getFile(target)); return;
}
if (!fso.FolderExists(target)) return;
// 指定パスのファイル一覧を得る
var dir = fso.GetFolder(target);
_enum(dir);
function _enum(dir) {
// ファイルを一つずつ処理する
var e = new Enumerator(dir.Files);
for ( ; !e.atEnd(); e.moveNext()) {
var file = e.item();
callback(file);
}
// 再帰的にディレクトリを処理する
e = new Enumerator(dir.SubFolders);
for ( ; !e.atEnd(); e.moveNext()) {
var sdir = e.item();
_enum(sdir);
}
}
}
// 利用例
var des = "c:¥¥backup";
enumFiles("c:¥¥test", function(f){
f.Copy(des + "¥¥" + f.Name);
});