ホーム < ゲームつくろー! < IKD備忘録

JavaScript(WSH)
特定フォルダ以下をトラバースしてファイル名を収拾


 コンバータやちょっとしたファイルチェッカーを作ろうと思ったらフォルダ以下をトラバースする作業が大抵出てきます。結構頻繁に出てくるのでテンプレートになるJScriptコードを置いておきます:

FileNameCollect.js
var wsh = new ActiveXObject("WScript.Shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");

// folderPath以下をトラバースしてファイル名をかき集める
function CheckFolder(filePathAry, folderPath, collectFunctor) {
    var folderObj = fso.GetFolder(folderPath);

    // ファイル名列挙
    var files = new Enumerator(folderObj.Files);
    for (; !files.atEnd(); files.moveNext()) {
        var filePath = fso.GetAbsolutePathName(files.item());
        if (collectFunctor(filePath) == true)
            filePathAry.push(filePath);
    }

    // サブフォルダへ
    var folders = new Enumerator(folderObj.SubFolders)
    for (; !folders.atEnd(); folders.moveNext()) {
        CheckFolder(filePathAry, folderPath + "\\" + folders.item().Name, collectFunctor);
    }
}

// 取得フィルター
// 全部集める
function nullFunctor(filePath) {
    return true;
}

// 特定拡張子のみ
function extFunctor(filePath) {
    var extArray = ["txt", "exe"];
    var ext = fso.GetExtensionName(filePath);
    for (var i = 0; i < extArray.length; i++)
        if (ext == extArray[i])
            return true;
    return false;
}

// カレントディレクトリ取得
var rootDir = wsh.CurrentDirectory;
var filePathAry = new Array;
CheckFolder(filePathAry, rootDir, extFunctor); // <- Fuctorでフィルター掛けられます

// 収集したファイルフルパスチェック
for (var i = 0; i < filePathAry.length; i++)
    WScript.Echo(filePathAry[i]);

 CheckFolder関数の第3引数にフィルタ関数を渡せば、特定の条件に見合うファイル名だけを収集できます。毎回このコードを思い出すのに時間がかかっていたので、これですっきりすっきり(^-^)。

 使い方は収拾を始めたいフォルダに上のjsを入れて、起動させる.batを作ります:

FileNameCollect.bat
cscript FileNameCollect.js

 引数に検索するルートパス名を渡す実装もありですね。