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

Technical Q&A QA1350
Storing file references in CFPreferences

Q:ファイル参照を CFPreference に格納する最も堅牢な方法は何でしょうか。

A: ファイル参照を Alias ハンドルに変換することです。つまり、Alias ハンドルの内容で CFData を作成し、CFPreferencesSetAppValue と CFPreferencesAppSynchronize を使用してこれを環境設定ファイルに格納します。

最初のリストは、ファイル参照を環境設定ファイルに保存する方法を示しており、2 番目のリストは、環境設定ファイルからファイル参照を再ロードする方法を示しています。

リスト 1: CFPreference へのファイル参照の保存

/*****************************************************
*
* SaveFSRefToPref(inFSRef, inKey)
*
* 目的:  ファイル参照をアプリケーションの環境設定に保存する
*
* 入力:   inFSRef     - The file reference
*          inKey       - the preference key
*
* 戻り値: なし
*/
void SaveFSRefToPref(const FSRef* inFSRef,
                     const CFStringRef inKey)
{
    AliasHandle tAliasHdl;
    OSErr err = FSNewAlias(NULL, inFSRef, &tAliasHdl);
    require_noerr(err, CantCreateAlias);

    CFDataRef tCFDataRef;
    tCFDataRef = CFDataCreate(kCFAllocatorDefault,
                              (UInt8*) *tAliasHdl,
                              GetHandleSize((Handle) tAliasHdl));
    require(NULL != tCFDataRef, CantCreateCFData);

    // 環境設定を設定
    CFPreferencesSetAppValue( inKey,
                              tCFDataRef,
                              kCFPreferencesCurrentApplication);
    // ディスクと同期をとる
    CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);

    CFRelease(tCFDataRef);
CantCreateCFData:
        DisposeHandle((Handle) tAliasHdl);
CantCreateAlias:
        return;
}

環境設定からファイル参照を復元するには:

リスト 2: ファイル参照の復元 reference:

/*****************************************************
*
* LoadFSRefFromPref(inFSRef, inKey)
*
* 目的:  アプリケーション環境設定からファイル参照をロードする
*
* 入力:  outFSRef    - ファイル参照を格納するアドレス
*         inKey       - 環境設定キー
*
* 戻り値:Boolean     - ロードに成功した場合は true
*/
Boolean LoadFSRefFromPref(FSRef* outFSRef, CFStringRef inKey)
{
    Boolean result = false; // 失敗と想定される

    CFDataRef tCFDataRef;
    tCFDataRef = (CFDataRef) CFPreferencesCopyAppValue(
                       inKey,
                       kCFPreferencesCurrentApplication);
    require(NULL != tCFDataRef, CantGetPreference);

    CFIndex dataSize = CFDataGetLength(tCFDataRef);
    AliasHandle tAliasHdl = (AliasHandle) NewHandle(dataSize);
    require(NULL != tAliasHdl, CantAllocateAlias);

    CFDataGetBytes(tCFDataRef,
                   CFRangeMake(0, dataSize),
                   (UInt8*) *tAliasHdl);

    FSRef tFSRef;
    Boolean wasChanged;
    OSErr err = FSResolveAlias(NULL,
                                tAliasHdl,
                                outFSRef,
                                &wasChanged);
    if (noErr == err) result = true;

    DisposeHandle((Handle) tAliasHdl);

CantAllocateAlias:
    CFRelease(tCFDataRef);
CantGetPreference:
    return result;
}

掲載日: 2005-02-23

ドキュメントの改訂履歴

日付 メモ
2005-02-23 "FSResolveAlias(NULL, tAliasHdl, &outFSRef, &wasChanged);" の第 3 番目のパラメータには、"&" は必要ありません: "FSResolveAlias(NULL, tAliasHdl, outFSRef, &wasChanged);"
2004-10-01 初版

掲載日: 2005-02-23