Access Finder别名图标

时间:2014-12-18 00:42:58

标签: objective-c macos

Finder会将Aliassymlink的图标显示为带有小箭头的文件夹。

我目前使用以下内容获取显示图标。

[[NSWorkspace sharedWorkspace] iconForFile:[item fullPath]]

这会将Alias的图标显示为带有小箭头的文件夹,但将符号链接显示为普通文件夹。

我假设OSX正在使用AliasBadgeIcon.icns合成图标,但为什么它不适用于符号链接。 两者都显示Kind为Alias。

有没有办法获取符号链接的复合词?

我可能用CALayer构建自己的(看起来很复杂)。我欢迎任何更简单的建议。

1 个答案:

答案 0 :(得分:1)

别名和符号链接行为差异的可能原因是许多低级别(POSIX / BSD)API会自动解析符号链接,而别名则不会。它可能是NSWorkspace中的一个错误,它获取了符号链接目标的图像而不是符号链接本身,而不是简单的忽略,以便特别避免。

我目前无法进行测试,但如果您可以将部署目标定位到10.10及更高版本,则可以尝试使用:

NSImage* icon;
if ([someURL getResourceValue:&icon forKey:NSURLThumbnailKey error:NULL])
    /* make use of icon */;

可能会更明智地提及指向符号链接的网址。

如果没有,您将获得NSURLIsSymbolicLinkKey资源值(作为布尔NSNumber)来确定是否需要合成这两个图像。要合成它们,请创建一个新图像,通过按顺序绘制两个图像来绘制自己:

NSImage* fileIcon = [[NSWorkspace sharedWorkspace] iconForFile:[item fullPath]];
NSImage* aliasBadge = /* ... load AliasBadgeIcon.icns ... */;
NSImage* badgedFileIcon = [NSImage imageWithSize:fileIcon.size flipped:NO drawingHandler:^BOOL (NSRect dstRect){
    [fileIcon drawAtPoint:dstRect.origin fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1];
    [aliasBadge drawAtPoint:dstRect.origin fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1];
    return YES;
}];