At 8:43 AM -0700 4/6/10, Jon Pugh wrote:
>I had to change to explicitly saving an AliasRecord in an NSData to keep track 
>of a file properly.

I should probably clean up and share my code too.  This uses an alias relative 
to your home folder. The alias is stored in NSUserDefaults under the specified 
key. You probably want to retain or copy the path you get from loadPathFromKey 
since it's autoreleased or nil.

Enjoy.

Jon


- (void) savePath: (NSString*) path forKey: (NSString*) key
{
        FSRef fsFile, fsHome;
        AliasHandle aliasHandle;
        NSString* homePath = [@"~" stringByExpandingTildeInPath];
        OSStatus status = FSPathMakeRef((unsigned char*)[homePath 
cStringUsingEncoding: NSUTF8StringEncoding], &fsHome, NULL);
        NSAssert(status == 0, @"FSPathMakeRef fsHome failed");
        status = FSPathMakeRef((unsigned char*)[path cStringUsingEncoding: 
NSUTF8StringEncoding], &fsFile, NULL);
        NSAssert(status == 0, @"FSPathMakeRef failed");
        OSErr err = FSNewAlias(&fsHome, &fsFile, &aliasHandle);
        NSAssert(err == noErr, @"FSNewAlias failed");
        NSData* aliasData = [NSData dataWithBytes: *aliasHandle length: 
GetAliasSize(aliasHandle)];
        [[NSUserDefaults standardUserDefaults] setObject: aliasData forKey: 
key];
}


- (NSString*) loadPathFromKey: (NSString*) key
{
        NSData* aliasData = [[NSUserDefaults standardUserDefaults] dataForKey: 
key];
        int aliasLen = [aliasData length];
        if (aliasLen > 0)
        {
                FSRef fsFile, fsHome;
                AliasHandle aliasHandle;
                OSErr err = PtrToHand([aliasData bytes], (Handle*)&aliasHandle, 
aliasLen);
                NSAssert(err == noErr, @"PtrToHand failed");
                NSString* homePath = [@"~" stringByExpandingTildeInPath];
                OSStatus status = FSPathMakeRef((unsigned char*)[homePath 
cStringUsingEncoding: NSUTF8StringEncoding], &fsHome, NULL);
                NSAssert(status == 0, @"FSPathMakeRef fsHome failed");
                Boolean changed;
                err = FSResolveAlias(&fsHome, aliasHandle, &fsFile, &changed);
                if (err == noErr)
                {
                        char pathC[2*1024];
                        status = FSRefMakePath(&fsFile, (UInt8*) &pathC, 
sizeof(pathC));
                        NSAssert(status == 0, @"FSRefMakePath failed");
                        return [NSString stringWithCString: pathC encoding: 
NSUTF8StringEncoding];
                }
        }
        else
        {
                NSLog(@"CardCollectionUserDefault was zero length");
                [NSAlert alertWithMessageText: nil
                                                defaultButton: nil
                                          alternateButton: nil
                                                  otherButton: nil
                        informativeTextWithFormat: @"CardCollectionUserDefault 
was zero length"];
        }
        return nil;
}

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to