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]);// ここで再帰.
}
};
この例では見つけたフォルダ内から 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の方法 よりずっと簡単かも。