OS X アプリからパスを指定してファインダーを開く
Swift プログラミング
とある自作の OS X アプリで扱っているフォルダーをファインダーで簡単に開けるようにしてみました。
NSWorkspace でファインダーを開く
アプリ内からコードを使ってファインダーを開くには NSWorkspace
の selectFile:inFileViewerRootedAtPath:
メソッドを使います。
self.workspace.selectFile(path, inFileViewerRootedAtPath: "")
こうすることで、指定したパスのファイルやフォルダーが選択された状態で Mac OS X のファインダーが開かれます。
指定できる引数
この NSWorkspace
の selectFile:inFileViewerRootedAtPath:
メソッドには、渡せる引数が 2 つあります。
引数名 | 引数の型 | 用途 |
---|---|---|
fullPath | String? | 選択するファイルをフルパスで指定します。 |
rootFullPath | String | ファインダーで開くフォルダーをフルパスで指定します。 |
最初の fullPath
でパスを指定すると、そのパスのファイルやフォルダーが選択された状態でファインダーが表示されます。
ここに nil
を指定することもできて、その場合は次の rootFullPath
で指定したパスがファインダーで開かれて、そこでは何も選択されていない状態になりました。
両方指定した場合は、最初の fullPath
で指定したパスが優先される様子でした。最初を相対パスにして次でそれのベースパスを指定するみたいな指定はできないようです。
なお、ドキュメントでは
rootFullPath
を指定すると新しいファイルビュアーが開かれ、空文字を指定するとメインのビュアーが選択される
とあったのですけど、試してみても動きの違いが自分にはよくわかりませんでした。
戻り値
この NSWorkspace
の selectFile:inFileViewerRootedAtPath:
メソッドは戻り値に Bool
型の値を返します。
ファインダーを開けたときに true
が、開けなかったときに false
が返るようになっていて、例えば パスが存在しない
ようなときに false
が返る様子でした。
シンボリックリンクには対応?
ドキュメントを見ると パスにシンボリックリンクが含まれるとき、OS X 10.5 以上ではシンボリックリンクを辿らない みたいなことが描かれているようなのですけど、実際に試してみるとちゃんと辿られているようで、よく分かりませんでした。
とりあえず、シンボリックリンクを含むパスを指定した時に支障が出るような時は、あらかじめ NSString
の stringByResolvingSymlinksInPath
を使って実際のパスに変換しておく必要がある様子でした。
スレッドセーフ
このメソッドはどのスレッドからでも実行することができるそうです。