首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从osx hdiutil命令返回的图像别名键的对象是什么数据?

从osx hdiutil命令返回的图像别名键的对象是什么数据?
EN

Stack Overflow用户
提问于 2014-07-02 12:39:34
回答 1查看 199关注 0票数 2

我有以下情况:

在我的应用程序中,用户必须安装一个特定的dmg文件(在任何时候)。这个dmg包含了应用程序需要处理并始终可用的一些数据。

我看的是“出问题”的情况。其中一种情况是,dmg文件在挂载时已被移动到另一个位置(另一个文件夹等)。

为了检查这一点,我使用了hdiutil info -plist命令,它生成一个属性列表,其中包含挂载的dmg文件的所有信息。

对于我的情况,这个属性列表中的重要键是image-path键和image-alias键;第一个键是dmg的实际位置(或最初挂载的路径),第二个键是dmg在执行hdiutil时(已被移动)的位置。

image-path是一个字符串值- image-alias是数据对象。

一个典型的plist看起来如下:

代码语言:javascript
复制
<key>image-alias</key>
    <data>
        AAAAAAF0AAIAAAxNYWNpbnRvc2ggSEQAAAAAAAAAAAAAAAAAAADP
        KL64SCsAAAAJ1UgMRVNNYXN0ZXIuZG1nAAAAAAAAAAAAAAAAAAAA
        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABeS
        ls/YacBkZXZpZGRza/////8AAAkgAAAAAAAAAAAAAAAAAAAACURv
        d25sb2FkcwAAEAAIAADPKKKYAAAAEQcwB0AGUAcgAuAGQAbQBnAA
        8AGgAMAE0AYQBjAGkAbgB0AG8AcwBoACAASABEABIAIVVzZXJzL3
        BtYXIvRG93bmxvYWRzL0VTTWFzdGVy
    </data>
<key>image-encrypted</key>
    <false/>
<key>image-path</key>
    <string>/Users/user/Downloads/Master.dmg</string>

(在xcode中打开图像别名数据时,如下所示:

代码语言:javascript
复制
<00000000 01740002 6163696e 20484400 00000000 00000000 00000000 0000cf28 beb8482b 00000009 00000000 00000000 00000000 00000000 ... >

另一方面,当运行(终端)没有-plist (屏幕上的输出)的hdiutil信息时,它返回:

代码语言:javascript
复制
$ hdiutil info
framework       : 371.1
driver          : 10.9v371.1
================================================
image-path      : /Users/user/Desktop/Master.dmg
image-alias     : /Users/user/Desktop/Master.dmg
shadow-path     : <none>
...

(这是命令应该正常返回的内容。在“事情变坏”的情况下,图像路径和图像别名应该是不同的路径)

我已经试过了

代码语言:javascript
复制
NSData *aliasData = [NSData dataWithData:[images valueForKey:@"image-alias"]];
NSString *alias = [[NSString alloc] initWithData:aliasData encoding:NSSymbolStringEncoding];

对于SymbolString、UTF、ASCII,但是它总是返回null。

所以问题来了:

有人知道图像别名对象是什么类型的数据吗?这样我就可以在字符串中转换并相应地使用它了吗?

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-16 08:30:58

经过大量的研究,大量的时间和最后的一个苹果技术问题,这个对象是一个包含BookmarkData的CFURL。

若要将其转换为NSString,使其具有可读性并可与其他字符串(在本例中为图像路径)进行比较,需要使用

CFURLCreateBookmarkDataFromAliasRecordCFURLCreateByResolvingBookmarkData

对于米利威的绝妙回答,一旦图像别名数据在

代码语言:javascript
复制
NSData *aliasData = dmgArray[i][@"image-alias"];

职能:

代码语言:javascript
复制
NSURL *aliasMountPoint(NSData *aliasMPData)
{
    CFErrorRef *err = NULL;
    CFDataRef aliasBookmark = CFURLCreateBookmarkDataFromAliasRecord(kCFAllocatorDefault, (__bridge CFDataRef)aliasMPData);

    if (aliasBookmark == nil)
        return nil;
    else
    {
        CFURLRef resolvedUrl = CFURLCreateByResolvingBookmarkData (NULL, aliasBookmark, kCFBookmarkResolutionWithoutUIMask, NULL, NULL, NO, err);
        return CFBridgingRelease(resolvedUrl);
    }
}

将执行转换。然后用:

代码语言:javascript
复制
NSString *imagealias = [aliasMountPoint(aliasData) absoluteString];

(请记住,这是我们在NSURL中转换的CFURL,absoluteString将其转换为NSString)

由于NSString包含绝对路径,所以

代码语言:javascript
复制
imagealias = [imagealias substringFromIndex:7]

若要删除字符串开头的file://,请执行以下操作。

然后简单地比较图像路径和图像别名中的两个字符串,按您的意愿进行,按照处理它们的方式处理aliasMountPoint函数中的任何错误,一切都设置好了!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24531309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档