它是别名'alis'
数据,在过去 20 年或更长时间里,它一直是在 Mac OS 中以持久方式引用文件的标准方式。;-)AliasHandle
等。al 都在 中Aliases.h
,它在CarbonCore.framework
伞形CoreServices
框架中。
请注意,它是属性列表编辑器(或 Xcode)向您显示NSData
. 数据告诉我们您没有更改硬盘驱动器的名称(它似乎仍然是“Macintosh HD”)并且别名的路径是/Users/rcharette/inbox
对此的“新奇”名称是书签数据,它是在 10.6 中引入的。
NDAlias
我相信Nathan Day 的别名有几个高级包装器。
否则,以下是我的,一个NSString
模仿新书签 API的类别NSURL
(需要 10.6)。(此代码应适用于 10.3+):
MDBookmarks.h:
#import <Foundation/Foundation.h>
// Constants
// MDBookmarkResolutionWithoutUI
// Option for specifying that no UI feedback accompany resolution of the bookmark data.
enum {
MDBookmarkResolutionDefaultOptions = 1,
MDBookmarkResolutionWithoutUI = ( 1UL << 8 )
};
typedef NSUInteger MDBookmarkResolutionOptions;
@interface NSString (MDBookmarks)
- (NSData *)bookmarkDataWithError:(NSError **)error;
+ (id)stringByResolvingBookmarkData:(NSData *)bookmarkData
options:(MDBookmarkResolutionOptions)options
bookmarkDataIsStale:(BOOL *)isStale error:(NSError **)error;
@end
MDBookmarks.m:
#import "MDBookmarks.h"
#import <CoreServices/CoreServices.h>
#import <sys/syslimits.h>
@implementation NSString (MDBookmarks)
- (NSData *)bookmarkDataWithError:(NSError **)outError {
if (outError) *outError = nil;
NSString *path = [[self stringByResolvingSymlinksInPath]
stringByStandardizingPath];
AliasHandle alias = NULL;
FSRef itemRef;
OSStatus status = FSPathMakeRef((const UInt8 *)[path UTF8String], &itemRef, NULL);
if (status != noErr) {
if (outError) {
if (status == fnfErr) *outError = [NSError errorWithDomain:NSCocoaErrorDomain
code:NSFileNoSuchFileError userInfo:nil];
else *outError = [NSError errorWithDomain:NSOSStatusErrorDomain
code:status userInfo:nil];
}
return nil;
}
status = FSNewAlias(NULL, &itemRef, &alias);
if (status != noErr ) {
if (outError)
*outError = [NSError errorWithDomain:NSOSStatusErrorDomain
code:status userInfo:nil];
return nil;
}
HLock((Handle)alias);
NSData *bookmarkData =
[[[NSData dataWithBytes:*alias length:GetHandleSize((Handle)alias)] retain] autorelease];
HUnlock((Handle)alias);
if (alias) DisposeHandle((Handle)alias);
return bookmarkData;
}
——</p>
+ (id)stringByResolvingBookmarkData:(NSData *)bookmarkData
options:(MDBookmarkResolutionOptions)options
bookmarkDataIsStale:(BOOL *)isStale error:(NSError **)outError {
if (bookmarkData == nil) return nil;
if (outError) *outError = nil;
AliasHandle alias = NULL;
FSRef resolvedRef;
Boolean wasChanged = false;
OSStatus status = PtrToHand([bookmarkData bytes], (Handle *)&alias,
[bookmarkData length]);
if (status) {
if (outError) *outError = [NSError errorWithDomain:NSOSStatusErrorDomain
code:status userInfo:nil];
return nil;
}
status = FSResolveAliasWithMountFlags(NULL, alias, &resolvedRef, &wasChanged,
(options & MDBookmarkResolutionWithoutUI ? kResolveAliasFileNoUI : 0));
if (status) {
if (outError) *outError = [NSError errorWithDomain:NSOSStatusErrorDomain
code:status userInfo:nil];
return nil;
}
UInt8 thePath[PATH_MAX + 1];
status = FSRefMakePath(&resolvedRef, thePath, PATH_MAX);
if (status != noErr) {
if (outError) *outError = [NSError errorWithDomain:NSOSStatusErrorDomain
code:status userInfo:nil];
return nil;
}
if (isStale) *isStale = wasChanged;
return [NSString stringWithUTF8String:(const char *)thePath];
}
@end
否则,如果您需要 10.6,请查看NSURL
.