Технические вопросы и ответы QA1350

Хранение ссылок на файл в CFPreferences

Q: Что самый устойчивый путь состоит в том, чтобы сохранить ссылку на файл в CFPreference?

A: Что самый устойчивый путь состоит в том, чтобы сохранить ссылку на файл в CFPreference?

Преобразуйте свою ссылку на файл в дескриптор Псевдонима; создайте CFData с содержанием того дескриптора Псевдонима и затем используйте CFPreferencesSetAppValue и CFPreferencesAppSynchronize для хранения его в предпочтительный файл.

Первое перечисление показывает, как сохранить Ссылку на файл на Предпочтительный файл и второе, как перезагрузить Ссылку на файл от Предпочтительного Файла.

Перечисление 1  , Сохраняющее ссылку на файл в CFPreference:

/*****************************************************
*
* SaveFSRefToPref(inFSRef, inKey)
*
* Purpose: Saves a file reference in an application preference
*
* Inputs: inFSRef - The file reference
*           inKey - the preference key
*
* Returns: none
*/
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);

    // set the preferences
    CFPreferencesSetAppValue( inKey, 
                              tCFDataRef,
                              kCFPreferencesCurrentApplication);
    // sync to disk
    CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);

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

Восстановить Вашу ссылку на файл от предпочтения:

Перечисление 2  , Восстанавливающее ссылку на файл:

/*****************************************************
*
* LoadFSRefFromPref(inFSRef, inKey)
*
* Purpose: Loads a file reference from an application preference
*
* Inputs: outFSRef - Address where to store the file reference
*           inKey - the preference key
*
* Returns: Boolean - true if the load was successful
*/
Boolean LoadFSRefFromPref(FSRef* outFSRef, CFStringRef inKey)
{
    Boolean result = false; // assume failure (pessimist!)

    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;
}


История версии документа


ДатаПримечания
23.02.2005

Третий параметр к «FSResolveAlias (NULL, tAliasHdl, &outFSRef, &wasChanged)»; не требует «и»: «FSResolveAlias (NULL, tAliasHdl, outFSRef, &wasChanged)»;

01.10.2004

Новый документ, что хранящий ссылки на файл в CFPreferences