Mac .Prefファイルヘックスパス
-
26-10-2019 - |
質問
ファイルパスをいくつかの.prefファイルに入力しようとしていますが、文字列の代わりに、フィールドは何らかの16進シーケンスを望んでいます。自分のパスをこのヘックス形式に変換するにはどうすればよいですか?
Mac OS 10.6.7
ファイルの場所の例は次のとおりです。
<00000000 009e0003 00010000 c94bbb14 0000482b 00000000 000d3ad2 000dfc12 0000c950 e4db0000 00000920 fffe0000 00000000 0000ffff ffff0001 0008000d 3ad2000c 9ce1000e 000c0005 0069006e 0062006f 0078000f 001a000c 004d0061 00630069 006e0074 006f0073 00680020 00480044 00120015 55736572 732f7263 68617265 7474652f 696e626f 78000013 00012f00 00150002 0010ffff 0000>
解決
それはエイリアスです 'alis'
データは、過去20年以上にわたってMac OSで永続的な方法でファイルを参照する標準的な方法でした。 ;-) 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
.
他のヒント
優先ファイルのパスは、ベース64エンコードされる場合があります。 OpenSSLを使用して値をde/encodeできます。
デコード: echo <encoded-path> | openssl enc -d -base64
エンコード: echo <path> | openssl enc -e -base64