检测是否在Cocoa中设置了自定义文件图标

时间:2013-04-15 14:36:08

标签: cocoa icons nsurl

我写了一个为某些文件设置自定义图标的应用程序,但由于创建这样的图标非常昂贵,我想测试之前是否已经设置了自定义图标。使用自定义图标,我的意思是一个不是OS X设置的默认图标的图标。特别是,我可以为具有相同类型的不同文件设置不同的图标。

我已尝试检查[NSURL resourceValuesForKeys:[NSArray arrayWithObjects:NSURLCustomIconKey,NSURLEffectiveIconKey,nil] error:nil],但与NSURLEffectiveIconKey相关联的对象始终为非零,NSURLCustomIconKey似乎为零,即使我调用[NSURL setResourceValue:myNonNilImage forKey:NSURLCustomIconKey error:nil]

顺便调用[[NSWorkspace sharedWorkspace] setIcon:myImage forFile:myFilename options:0]似乎是更改Finder中显示的图标的唯一方法。

2 个答案:

答案 0 :(得分:1)

NSURLCustomIconKey始终返回nil,因为未实现对此密钥的支持。标题中提到了这一重要信息,但NSURL文档中没有提到。在支持之前,获取此信息的一种方法是使用不推荐使用的文件管理器方法:

- (BOOL)fileHasCustomIcon:(NSString *)path {
    FSRef ref;
    FSCatalogInfo info;

    if (FSPathMakeRef((const UInt8 *)[path fileSystemRepresentation], &ref, NULL) == noErr) {
        if (FSGetCatalogInfo(&ref, kFSCatInfoFinderInfo, &info, NULL, NULL, NULL) == noErr) {
            FileInfo *fileInfo = (FileInfo *)(&info.finderInfo);
            return (fileInfo->finderFlags & kHasCustomIcon) != 0;
        }
    }

    return NO;
}

答案 1 :(得分:0)

NSWorkspace的文档说setIcon:forFile:options:如果成功则返回YES。

使用该信息,您只需切换NSUserDefault布尔值即可。这里使用了一些代码:

if (![[NSUserDefaults standardUserDefaults] boolForKey:@"iconImageSaved"]) {
    if ([[NSWorkspace sharedWorkspace] setIcon:myImage forFile:myFilename options:0])
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"iconImageSaved"];
}

希望这有帮助