Это псевдоним 'alis'
данных, который является стандартным способом постоянного обращения к файлам в Mac OS в течение последних 20 лет или более. ;-) The AliasHandle
et. Все они находятся в Aliases.h
, который находится в CarbonCore.framework
CoreServices
зонтичной структуры.
Обратите внимание, что это редактор списка свойств (или Xcode), который показывает вам шестнадцатеричное представление NSData
. Данные говорят нам, что вы не изменили имя своего жесткого диска (он по-прежнему называется «Macintosh HD») и что путь псевдонима был /Users/rcharette/inbox
"newfangled" имя для этого - данные закладки, которые были введены в 10.6.
Есть пара высокоуровневых оболочек вокруг псевдонимов, я думаю, что NDAlias
Натана Дея.
В противном случае, моя следующая категория - 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;
}
-
+ (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, проверьте новые API в NSURL
.