Mac .pref File Hex Path - PullRequest
       9

Mac .pref File Hex Path

0 голосов
/ 11 июня 2011

Я пытаюсь ввести путь к файлу в нескольких файлах .pref, но вместо строки поле требует какой-то шестнадцатеричной последовательности. Как я могу преобразовать свой путь в этот шестнадцатеричный формат?

Mac OS 10.6.7

Вот пример расположения файла:

<00000000 009e0003 00010000 c94bbb14 0000482b 00000000 000d3ad2 000dfc12 0000c950 e4db0000 00000920 00000000 fffe0000 0000ffff ffff0001 0008000d 3ad2000c 9ce1000e 000c0005 0069006e 0062006f 0078000f 001a000c 004d0061 00630069 006e0074 006f0073 00680020 00480044 00120015 55736572 68617265 732f7263 7474652f 696e626f 78000013 00150002 00012f00 0010ffff 0000>

Ответы [ 2 ]

2 голосов
/ 16 июня 2011

Это псевдоним '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.

0 голосов
/ 11 июня 2011

Пути в файлах настроек иногда кодируются в base64. Вы можете использовать openssl для де / кодирования значений:

Декодировать : echo <encoded-path> | openssl enc -d -base64

Кодировать : echo <path> | openssl enc -e -base64

...