zz log

zaininnari Blog

再帰的なファイル一覧の取得

↓作った理由

  • バッチ処理から、「サブディレクトリも処理」にチェックを入れて、個別に JavaScript を呼ぶアクションを呼んでもいいけれど、それだと、JavaScript のコードの場所が決め打ちになってしまうので、場所をフリーにするには、自前でファイル一覧を作成する必要があった
  • Folder.selectDialog() で処理するフォルダと出力するフォルダをフリーに選択したかった。(バッチで JavaScript を呼ぶと、どうしても JavaScript か アクションに 出力するフォルダを決め打ちする必要があって、それを他人に説明してやってもらうのが面倒)

PhotoshopJavaScript は、IE的 ではなく Firefox や Chomre などの標準的な書き方で書けます。(ここが書いてて気持ちいい)
app(アプリケーション全体)、activeDocument(アクティブになっている画像)など、Photoshop ならではの機能もあります。

環境

ソースコード

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;
}