序
業務でAfterEffectsのscriptを作るにあたり、多数のプロジェクトを自動で一括処理するものを作ろうと心がけています。
ところがデザイナーの方は、1つのプロジェクトを選択して処理して、最後はそのプロジェクトが編集状態になっているもののほうが、直観的で便利だと思われるようです。
そんなすれ違いにもめげずに、一括処理のお友の指定パス内のファイル収集スクリプトを2つ紹介します。
汎用性重視~再帰的ファイル収集
まず、汎用性が高いコードとして、再帰的にファイル収集する方法
以下のURLを参考にしました。
たこなぐりの日々
パス内のフォルダの中にある全ファイルをフォルダ内も全部探ってぶっこ抜く。
http://d.hatena.ne.jp/Takomaru/20131118/1384780530
OPENSPACE
Illustrator CS/CS2/CS3/CS4/CS5編 サブフォルダ内にある全てのAIファイルを開く
http://www.openspc2.org/projectX/Illustrator/0071/
rootFolderObj = Folder.selectDialog("フォルダを選択してください");
$.writeln(new Date());
fList = getAllFile(rootFolderObj, [".png"]); // 拡張子は小文字で
$.writeln(new Date());
function getAllFile(folderObj, ext)
{
if (!folderObj) return; // キャンセルされたら処理しない
var list = [];
getFolder(folderObj);
return list; // フォルダ内の一覧を取得
function getFolder(folderObj) {
var fList = folderObj.getFiles();
for (var i=0; i<fList.length; i++)
{
if (fList[i].getFiles) {
getFolder(fList[i]); // サブフォルダがある限り繰り返す
} else {
var f = fList[i].name.toLowerCase();
for(var j=0; j<ext.length; j++) {
if (f.indexOf(ext[j]) > -1) {
list.push(fList[i]);
}
}
delete f;
}
}
delete fList;
}
}
処理速度重視~ディレクトリコマンド出力整形
次に汎用性が低い方法です。
要は、DOSコマンドのdirの結果を整形するだけです。
OS X版のAfterEffectsでも「ls -R」コマンドの出力結果を整形すれば同じ事ができるはずです。
var folderObj = Folder.selectDialog("フォルダ選択");
$.writeln(new Date());
fileList = getAllFile_cmd(folderObj, ".png");
$.writeln(new Date());
function getAllFile_cmd(folderObj, ext)
{
var cmd_dir = "cmd.exe /c dir " + folderObj.fsName + "\\*" + ext + " /s /b";
var list = system.callSystem(cmd_dir);
return(list.split(/\r\n|\r|\n/));
}
考察
再帰起処理は、ファイルやフォルダの数が増えると処理時間が数の増減以上に増えます。
またメモリも大量に使用するため、アプリケーションのスクリプト向けではありません。
ただ多くの処理系で一般的な方法なので移植性や応用性は高いです。
DOSコマンドの結果を受け取る方法は、文字列の整形処理のせいで汎用性が低いですが、処理が高速です。
OS X版でもできると書きましたが、文字列の整形処理はWindows版と変更する必要があるでしょう。
私はプロジェクトで扱うファイル数が数万のオーダーになった時点で、再帰処理はやめることにしました。
今は数十万のオーダーなので(略