如何获取文件的“com.apple.icns”数据来填充粘贴板?

问题描述 投票:0回答:1

当用户在 Finder 中复制文件时,粘贴板包含“icns”类型,其中包含所复制项目的各种图标描述。

我需要在代码中实现相同的效果,即生成可以放入粘贴板的

com.apple.icns
类型的数据。

如何收集此类数据?我在 AppKit 中能找到的只是获取文件的 NSImage 的函数,但没有给我提供 icns 资源。

swift objective-c appkit nsimage nspasteboard
1个回答
0
投票

这是代码,使用已弃用的函数(但显然没有现代替代方案):

#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
© www.soinside.com 2019 - 2024. All rights reserved.