Retired Document
Important: Retired Document: This document may not represent best practices for current development. Links to downloads and other resources may no longer be valid.
Storing file references in CFPreferences
Q: What is the most robust way to store a file reference into a CFPreference?
A: What is the most robust way to store a file reference into a CFPreference?
Convert your file reference into an Alias handle; create a CFData with the contents of that Alias handle and then use CFPreferencesSetAppValue and CFPreferencesAppSynchronize to store it into your preferences file.
The first listing shows how to save a File Reference to a Preference file, and the second how to reload the File Reference from the Preference File.
Listing 1 Saving a file reference into a 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;
} |
To restore your file reference from the preference:
Listing 2 Restoring the file reference:
/*****************************************************
*
* 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;
} |
Document Revision History
| Date | Notes |
|---|---|
| 2018-06-04 | Moved to Retired Documents Library. |
| 2005-02-23 | The third parameter to "FSResolveAlias(NULL, tAliasHdl, &outFSRef, &wasChanged);" doesn't require the "&": "FSResolveAlias(NULL, tAliasHdl, outFSRef, &wasChanged);" |
New document that describes storing file references in CFPreferences |
Copyright © 2018 Apple Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2018-06-04