// // NSFileManager-AliasExtensions.m // // Created by Drew Hamlin on 8/26/06. // Copyright 2006 Drew Hamlin. All rights reserved. // #import "NSFileManager-AliasExtensions.h" @implementation NSFileManager (AliasExtensions) - (NSData *)aliasDataForPath:(NSString *)path; { if (!path) return nil; // Convert the path to a file reference FSRef fileReference; if (FSPathMakeRef((const UInt8 *)[[path stringByStandardizingPath] fileSystemRepresentation], &fileReference, false) != noErr) return nil; // Create an alias Handle aliasHandle; if (FSNewAlias(NULL, &fileReference, (AliasHandle *)&aliasHandle) != noErr) return nil; // Convert the handle to data if (!aliasHandle) return nil; HLock(aliasHandle); CFDataRef aliasData = CFDataCreate(kCFAllocatorDefault, (const UInt8 *)*aliasHandle, GetHandleSize(aliasHandle)); HSetState(aliasHandle, HGetState(aliasHandle)); return [(NSData *)aliasData autorelease]; } - (NSString *)pathForAliasData:(NSData *)aliasData; { if (!aliasData) return nil; // Convert the data to a handle CFIndex dataLength = CFDataGetLength((CFDataRef)aliasData); Handle aliasHandle = NewHandle(dataLength); if (!(aliasHandle && dataLength)) return nil; HLock(aliasHandle); BlockMoveData(CFDataGetBytePtr((CFDataRef)aliasData), *aliasHandle, dataLength); HUnlock(aliasHandle); // Resolve the alias FSRef fileReference; Boolean wasChanged; if (FSResolveAlias(NULL, (AliasHandle)aliasHandle, &fileReference, &wasChanged) != noErr) return nil; // Convert the file reference to a path CFURLRef temporaryURL = CFURLCreateFromFSRef(kCFAllocatorDefault, &fileReference); if (!temporaryURL) return nil; CFStringRef path = CFURLCopyFileSystemPath(temporaryURL, kCFURLPOSIXPathStyle); CFRelease(temporaryURL); return [(NSString *)path autorelease]; } @end