再帰的なファイル一覧の取得
↓作った理由
- バッチ処理から、「サブディレクトリも処理」にチェックを入れて、個別に JavaScript を呼ぶアクションを呼んでもいいけれど、それだと、JavaScript のコードの場所が決め打ちになってしまうので、場所をフリーにするには、自前でファイル一覧を作成する必要があった
- Folder.selectDialog() で処理するフォルダと出力するフォルダをフリーに選択したかった。(バッチで JavaScript を呼ぶと、どうしても JavaScript か アクションに 出力するフォルダを決め打ちする必要があって、それを他人に説明してやってもらうのが面倒)
Photoshop の JavaScript は、IE的 ではなく Firefox や Chomre などの標準的な書き方で書けます。(ここが書いてて気持ちいい)
app(アプリケーション全体)、activeDocument(アクティブになっている画像)など、Photoshop ならではの機能もあります。
環境
- Photoshop Ex CS4 (Windows)
ソースコード
function _getFileList(path) { // @param Folder Object // @return array var rv = [], files = path.getFiles(), len = files.length, i; for (i=0;i<len;i++) { if (files[i].alias) { continue; } if (files[i].constructor.name === 'File') { // file rv.push(files[i].fsName); } else { // folder rv.push.apply(rv, arguments.callee(files[i])); } } return rv; }
解説
// 引数 path には、Folder Object を与えてください。 // その1 // 一番シンプルな呼び方 // var dirObj = new Folder('c:\'); // その2 // 選択タイアログで選択したフォルダは、Folder Object です。 // var dirObj = Folder.selectDialog("処理フォルダを選択してください"); function _getFileList(path) { // @param Folder Object // @return array var rv = [], // 与えた引数の直下のフォルダ・ファイル一覧を取得します。 // (PHP の scandir などとは異なり、「.」や「..」は含まれません。) // フォルダの場合は、Folder オブジェクトで、 // ファイルの場合は、File オブジェクトで取得できます。 files = path.getFiles(), len = files.length, i; for (i=0;i<len;i++) { // 取得した一覧には、ショートカットが含まれることがあります。 // ショートカットの場合は、処理をスキップします。 if (files[i].alias) { continue; } // クラス名を見て分岐します。 if (files[i].constructor.name === 'File') { // file // ファイルの場合、絶対パスを配列に追加します。 rv.push(files[i].fsName); } else { // folder // フォルダの場合、再帰で自分自身を呼び出し、 // 結果をマージします。 rv.push.apply(rv, arguments.callee(files[i])); } } // 結果は、以下の様に1次配列で返ります。 // ['c:\User\userName\aaa.jpg', 'c:\bbb.doc', 'c:\ccc.ai'] return rv; }