Home>Monologue> Part of Script factory. scriptfactory@mac.com .

Desktopの悪魔

Contents

Introduction

AppleScriptでは、Finderを通してDesktop上のitemを扱うには色々と問題があります。問題になるのは、起動ディスク以外のディスクのDesktop上のitemを扱う場合です。自分が気付いている範囲で、その問題に付いて解説してみます。

悪魔その1〜起動Disk以外のDesktopにはファイルを作れない!!〜

良く知られているのは、起動Disk以外のDesktop Folderに新しいfileをAppleScriptから作ることができないことです。

例えばfile "Macintosh HD:test.txt"と言うfileがあったとします。Macintosh HDが起動Diskです。これをfolder "Temp HD:Desktop Folder:"にcopyしようとします。

tell application "Finder" 
    duplicate file "Macintosh HD:test.txt" to folder "Hard Disk2:Desktop Folder:" 
end tell

はたして、このscriptを実行するとちゃんとDesktop上に test.txtというfileが作られるのですが、このfileは本当にfolder "Hard Disk2:Desktop Folder:"に居るのでしょうか?実際のところ、なにがどうしたことやら実際はfolder "Macintosh HD:Desktop Folder:"、すなわち起動DiskのDesktopに作られてしまいます。

う〜ん、これはいったいどうゆう事なのでしょう。とりあえず、Finderに頼らず同じことをOSAXを使ってやってみることにします。Jon's CommandsというOSAXを使う事にします。

copyFile file "Macintosh HD:test.txt" to file "Hard Disk2:Desktop Folder:test.txt"

これだとうまく行っちゃうんですね。したがって起動Disk以外のDesktop Folderにfileを作れないのは、Finderのせいであると考えられます。

なんともおかしく理不尽な事なんですが、起動Disk以外のDesktop Folderをまともに扱えないのはFinderのせいみたいです。ここでは、起動Disk以外のDesktopにfileをcopyするという事を試みましたが、試して頂けると分かりますが、Finderを通してDesktopにaccessするときは一緒です。たとえば、新しくfolderを作るなどでしょうか。はたしてこれがFinderの仕様なのかどうかわかりませんが、かなり罪深い事になっています。

悪魔その2〜いきなり文字列に変換してはなりませぬ〜

Desktopにあるobject(fileとかfolder)をFinderから指定する時は、disk名とかを省略できるみたいです。具体的には、

alias "Hard Disk2:Desktop Folder:WorkSpace:hello.txt"

というfileを単に、

file "hello.txt" of folder "Workspace"

とやっても参照できるみたいなんです。そして、このFinderの参照形式をいきなり文字列に変換しようとすると、なぜかそいつは起動Diskに存在することになってしまいます。すなわち、

tell application "Finder" 
    set theFile to file "hello.txt" of folder "Workspace" 
    set thePath to theFile as string 
end tell

ということをするとtheFileは"Macintosh HD:Desktop Folder:Workspace:hello.txt"というように起動diskにあることになってしまって、大嘘の結果になってしまうのです。

つまり、一般的に、上記のような〜of 〜 of 〜と言った、Finderのobjsctへの参照をいきなり文字列に変換してはいかん!!と言うことになります。

aliasには、正しく変換できるので,どうしても文字列を取り出したければ、一度aliasに変換してそれを文字列にさらに変換しなさいということになります。すなわち、

tell application "Finder" 
    set theFile to file "hello.txt" of folder "Workspace" 
    set thePath to (theFile as alias) as string 
end tell

というようにしなければいかん!!ということです。

上記のような〜of 〜 of 〜という形のFinder objectへの参照を自分でスクリプト中に書くことはないと思いますが、それが値として返ってくる場合は幾らでも考えられます。例えば、insertion locationとか、selectionといったものを求めると〜of 〜 of 〜という形の値が返ってきます。さらにalias fileのoriginalやcontainer windowのfolder propertyを求める時とか・・・。

Fileへの参照を文字列に変換する時は、それがどんな形式なのか良く気をつけて行わないと、スクリプトが動いたり動かなかったりするやっかいなbugの原因になります。こういうことで、スクリプトがなぜかときどきちゃんと動かん!!、とはまる人は結構いるんじゃないでしょうか。

悪魔その3 〜Desktop上のitemは、どのdiskに所属しているのか?〜

突然ではありますが、desktop上にあるitemが所属しているフォルダをFinderに尋ねてはいけません。もっと言えば、Finderに、あるitemが所属しているフォルダを尋ねてはいけません。すなわちfolder of 〜ということをしてはなりません。

起動ディスク以外のDesktop Folderに所属している、ファイル

alias "Hard Disk2:Desktop Folder:momo.txt"

というファイルがあったとしましょう。このファイルが所属しているフォルダをFinderに尋ねてみましょう。

set theFile to alias "Hard Disk2:Desktop Folder:momo.txt" 
 
tell application "Finder" 
    folder of theFile 
end tell 
  --result:  desktop of application "Finder"

desktop of application "Finder"というのが返ってきましたが、果たして、これは、alias "Hard Disk2:Desktop Folder:"を意味しているのでしょうか?答えはNoです。desktop of application "Finder"とは、起動ディスクのDesktop Folderを意味しており、決してそれ以外のマウントされているディスクのDesktop Folderじゃない。すなわち、このスクリプトではalias "Hard Disk2:Desktop Folder:momo.txt"は、なぜか起動ディスクのDesktop Folderにいることになっちゃっているんです。

多くの場合は、alias "Hard Disk2:Desktop Folder:"という結果がほしいんじゃないでしょうか?しかし、このような結果は、Finderを経由していては決して得られません。Desktop上のitemに対してはfolder of〜ということをしてはいけないんです。さらに、汎用的なスクリプトを書こうと思ったら、あらゆる場面で、folder of 〜ということをしてはいけない。

この問題を回避するには、path文字列を解析するしかないんじゃないでしょうか?というわけで、path文字列を解析して引き出せるだけの情報を引き出してくれるライブラリPath Analyzerをご用意しております。ぜひご利用くださいませ。

Summary

そもそも、Finderのdesktop object周りがいかれくるっているのは、MacintoshのDesktopというものが、「すべてのマウントされているディスク直下にあるDesktop Folderが重なったものである」という特殊事情が起因しているように思えます。そして、Finderのobjectが見たままの構造で参照できるように、無理していることがさらに状況をさらに悪いものにしているではないでしょうか?

まあ、ソフトウェアのbugというより、ソフトウェアの仕様上のbugだと思うのですが、もうちょっと考えてくれよ〜>Apple、と思うのは僕だけでしょうか?

まあ、ケースバイケースなんですが、このMonologueのまとめです。


This page was last built on Wed, Feb 17, 2016 ; 10:03:44 AM . Thanks for checking it out!