Home About
extendscript, javascript, recursion

Extendscript で 指定したフォルダ以下のフォルダ全部を探すには その2 (もっと単純に)

Extendscript で 指定したフォルダ以下のフォルダ全部を探すには その1 よりもっとシンプルに書く方法。 フォルダを順に辿りながら、フォルダを見つけたら callback する方式。

考え方

引数でフォルダを与えられたら、そのフォルダのサブディレクトリを取得してそれぞれのサブディレクトリ毎に再度自分自身を呼び出す再帰関数。 その関数使う側で、見つけたフォルダを取得できるように callback 関数を渡しておく。

だいたいこんな感じ:

var traverse = function(folder, callback){
    // 1)
    callback(folder);

    // 2)
    var subFolders = children(folder);
    if( subFolders.length==0 ){
        return ; // 終了.
    }

    // 3)
    for(var i=0; i<subFolders.length; i++){
        traverse(subFolders[i]);// ここで再帰.
    }
};
  1. 見つけたフォルダを callback する.
  2. サブフォルダを取得して それがなければ、処理を終了.
  3. サブフォルダがあれば、ループしてそれぞれのサブフォルダを引数に再度 traverse 関数を呼ぶ.

コード全体

この例では見つけたフォルダ内から png ファイルを探して出力しています.

var isFolder = function(fileOrFolder){
    return ( fileOrFolder.constructor.name == 'Folder' );
};

// このフォルダ内にあるフォルダリストを返す.
var children = function(folder){
    var files = folder.getFiles();
    var folderList = [];
    for(var i=0; i<files.length; i++){
        if( isFolder(files[i]) ){
            folderList.push(files[i]);
        }
    }
    return folderList;
};


var traverse = function(folder, callback){
    callback(folder);

    var subFolders = children(folder);
    if( subFolders.length==0 ){
        return ;
    }

    for(var i=0; i<subFolders.length; i++){
        traverse(subFolders[i], callback);
    }
}

var dir = '/path/to/targetFolder';
var folder = Folder(dir);

traverse(folder, function(myFolder){
    // ここに見つけたフォルダが callback される.
    // フォルダ内から png ファイルを探して出力する.
    var files = myFolder.getFiles('*.png');
    for(var j=0; j<files.length; j++){
        $.writeln(files[j]);
    }
});

ただ特定フォルダ以下にある ○○のファイルを探す、などの処理であれば、 こちらの方が その1の方法 よりずっと簡単かも。