2865


Adobe ExtendScript CS6で、Adobe Photoshop CS6向けにJavascriptで書いたコードです。

[code]

        filename = app.activeDocument.path;
        alert(filename);
        alert(filename.length);
    
[/code]

以上のコードを実行すると最初に **~/Desktop** が表示されます。  
しかし、その次は **undefined** と表示されます。

[code]

        filename = app.activeDocument.fullName;
        alert(filename);
        alert(filename.length);
    
[/code]

こちらのコードの場合は最初に **~/Desktop/waiwai.psd** が表示されます。  
その次は **32002** と表示されてしまいます。

私にはどうしてlengthオプションでこのような値が出てしまうのか理解できませんでした。  
これの有効な対処方法はあるでしょうか？


CC BY-SA 3.0
2014-12-31T16:23:00.810
2861
2014-12-31T17:33:30.580
2014-12-31T17:26:27.157
728
5947
question
javascript
Photoshopプラグイン（Javascript）でアクティブドキュメントのファイルパスを取得するとlengthの値がおかしくなる


pathやfullNameで取れているのが文字列ではなくてFolderオブジェクトやFileオブジェクトだからです。

Fileクラスにおいてはlengthはファイルサイズ（バイト）を表し、Folderクラスにはそれがないのでundefinedとなっています。

クラスの詳細は ExtendScript Toolkitで ヘルプ→オブジェクトモデルビューアで表示された左上からFileやFolderを探してください。

今回の場合は

[code]

    var fullFoldername = app.activeDocument.path.fullName;
    alert(fullFoldername.length);
    var foldername = app.activeDocument.path.name;
    alert(foldername.length);
    
    var fullFilename = app.activeDocument.fullName.fullName;
    alert(fullFilename.length);
    var filename = app.activeDocument.name;
    alert(filename.length);
    
[/code]

とすれば求める値が取得できます。

…だけど app.activeDocument.fullName でファイルオブジェクトが返るのは違和感を覚えますね。

オブジェクトモデルビューアでブラウザを`Adobe Photoshop CS6 Object Library`
に切り替えてDocument.fullNameプロパティを調べてみると

> Document.fullName (Read Only)  
>  Data Type: File

なので、仕様通りですが。

# 追記

ちなみに、alertだとフォルダ名やファイル名がとれていてそれらが文字列っぽく見えたのは、そのクラスの文字列表現がnameかfullNameを返すようにつくられているからです。  
誤解を恐れず簡単に言ってしまえば、toString()してとれる値が表示されていただけです。


CC BY-SA 3.0
2014-12-31T17:25:25.603
2865
2014-12-31T17:33:30.580
2014-12-31T17:33:30.580
728
728
2861
answer