当用户在 Finder 中复制文件时,粘贴板包含“icns”类型,其中包含所复制项目的各种图标描述。
我需要在代码中实现相同的效果,即生成可以放入粘贴板的
com.apple.icns
类型的数据。
如何收集此类数据?我在 AppKit 中能找到的只是获取文件的 NSImage 的函数,但没有给我提供 icns 资源。
这是代码,使用已弃用的函数(但显然没有现代替代方案):
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
NSData* icnsOfFileAtPath (NSString *path)
{
// based on https://github.com/sveinbjornt/IconFamily
CFURLRef urlRef = CFURLCreateWithFileSystemPath (kCFAllocatorDefault, (CFStringRef)path, kCFURLPOSIXPathStyle, false);
if (!urlRef) {
return nil;
}
FSRef fsRef;
bool ok = CFURLGetFSRef (urlRef, &fsRef);
CFRelease (urlRef);
if (!ok) {
return nil;
}
IconRef iconRef;
SInt16 label;
OSStatus res = GetIconRefFromFileInfo (&fsRef, 0, NULL, kFSCatInfoNone, NULL, kIconServicesNormalUsageFlag, &iconRef, &label);
if (res) {
return nil;
}
IconFamilyHandle ifh;
res = IconRefToIconFamily (iconRef, kSelectorAllAvailableData, &ifh);
ReleaseIconRef (iconRef);
NSData *icns = [NSData dataWithBytes:*ifh length:GetHandleSize((Handle)ifh)];
DisposeHandle ((Handle)ifh);
return icns;
}
#pragma clang diagnostic pop