OS X アプリからパスを指定してファインダーを開く

Swift プログラミング

とある自作の OS X アプリで扱っているフォルダーをファインダーで簡単に開けるようにしてみました。

自作の OS X アプリで扱っているフォルダーをファインダーで簡単に開けたら何かと便利だと思って、それを実現するコードを実装してみることにしました。

NSWorkspace でファインダーを開く

アプリ内からコードを使ってファインダーを開くには NSWorkspaceselectFile:inFileViewerRootedAtPath: メソッドを使います。

self.workspace.selectFile(path, inFileViewerRootedAtPath: "")

こうすることで、指定したパスのファイルやフォルダーが選択された状態で Mac OS X のファインダーが開かれます。

指定できる引数

この NSWorkspaceselectFile:inFileViewerRootedAtPath: メソッドには、渡せる引数が 2 つあります。

引数名 引数の型 用途
fullPath String? 選択するファイルをフルパスで指定します。
rootFullPath String ファインダーで開くフォルダーをフルパスで指定します。

最初の fullPath でパスを指定すると、そのパスのファイルやフォルダーが選択された状態でファインダーが表示されます。

ここに nil を指定することもできて、その場合は次の rootFullPath で指定したパスがファインダーで開かれて、そこでは何も選択されていない状態になりました。

両方指定した場合は、最初の fullPath で指定したパスが優先される様子でした。最初を相対パスにして次でそれのベースパスを指定するみたいな指定はできないようです。


なお、ドキュメントでは rootFullPath を指定すると新しいファイルビュアーが開かれ、空文字を指定するとメインのビュアーが選択される とあったのですけど、試してみても動きの違いが自分にはよくわかりませんでした。

戻り値

この NSWorkspaceselectFile:inFileViewerRootedAtPath: メソッドは戻り値に Bool 型の値を返します。

ファインダーを開けたときに true が、開けなかったときに false が返るようになっていて、例えば パスが存在しない ようなときに false が返る様子でした。

シンボリックリンクには対応?

ドキュメントを見ると パスにシンボリックリンクが含まれるとき、OS X 10.5 以上ではシンボリックリンクを辿らない みたいなことが描かれているようなのですけど、実際に試してみるとちゃんと辿られているようで、よく分かりませんでした。

とりあえず、シンボリックリンクを含むパスを指定した時に支障が出るような時は、あらかじめ NSStringstringByResolvingSymlinksInPath を使って実際のパスに変換しておく必要がある様子でした。

スレッドセーフ

このメソッドはどのスレッドからでも実行することができるそうです。