Apple Developer Connection
高度な検索
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1449
Setting default open Finder window

Q:ディスクがマウントされたときにデフォルトのFinderウインドウを開くように設定するにはどうしたらよいですか?

A:ディスクがマウントされたときに、指定したフォルダをFinderで自動的に開くことができます。これは、CDやディスクイメージでソフトウェアを配布する場合、特に便利です。

ボリュームヘッダーにあるfinderInfoフィールドの3つ目のUInt32には、ボリュームがマウントされたときにFinderに表示するディレクトリウインドウのディレクトリID、または開くティレクトリウインドウが無い場合にはゼロが格納されています。Mac OS XのFinderはこのフィールドを変更しません。

リスト1:ボリュームfrOpenChainの設定

// コマンドラインツールは引数を1つとります。ディスクのマウント時にFinderが開くディレクトリへのパス。
// SetOpenWindow path/to/directory/to/open

#include <CoreServices/CoreServices.h>

int  main( int argc, const char *argv[] )
{
  OSStatus    err;
  FSRef      dirFSRef;
  FSCatalogInfo  fsCatalogInfo;
  FSVolumeInfo  fsVolumeInfo;

  // ディスクのマウント時に自動的に開くフォルダを渡す、FSRefを作成。
  err  = FSPathMakeRef( (const UInt8 *)argv[1], &dirFSRef, NULL );
  if ( err != noErr )  goto Bail;
  err  = FSGetCatalogInfo( &dirFSRef, kFSCatInfoGettableInfo, &fsCatalogInfo, NULL, NULL, NULL );
  if ( err != noErr )  goto Bail;

  // 従来のMac OSでは、frOpenChainは開くウインドウのリスト。完全を期すためにこれをゼロに設定。
  ((ExtendedFolderInfo*)&fsCatalogInfo.extFinderInfo)->reserved1  = 0;
  err  = FSSetCatalogInfo( &dirFSRef, kFSCatInfoFinderXInfo, &fsCatalogInfo );
  if ( err != noErr )  goto Bail;

  // ボリュームのfinderInfoを取得。
  err  = FSGetVolumeInfo( fsCatalogInfo.volume, 0, NULL, kFSVolInfoFinderInfo, &fsVolumeInfo, NULL, NULL );
  if ( err != noErr )  goto Bail;

  // 新しいフォルダIDを設定。
  ((UInt32*)&(fsVolumeInfo.finderInfo))[2]  = fsCatalogInfo.nodeID;
  err  = FSSetVolumeInfo( fsCatalogInfo.volume, kFSVolInfoFinderInfo, &fsVolumeInfo );
  if ( err != noErr )  goto Bail;

Bail:
  return( err );
}

ドキュメント改訂履歴

日付メモ
2006-01-03初版

掲載日: 2006-01-03




Did this document help you?
Yes: Tell us what works for you.

It’s good, but: Report typos, inaccuracies, and so forth.

It wasn’t helpful: Tell us what would have helped.