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 |