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

检测Cocoa中是否设置了自定义文件图标,cocoa,icons,nsurl,Cocoa,Icons,Nsurl,我写了一个为一些文件设置自定义图标的应用程序,但是由于创建这样的图标非常昂贵,我想测试一下以前是否已经设置了自定义图标。对于自定义图标,我指的是一个不是OS X设置的默认图标的图标。特别是,对于具有相同类型的不同文件,我可以有不同的图标 我已经尝试检查[NSURL resourceValuesForKeys:[NSArray array with objects:NSURLCustomIconKey,NSURLEffectiveIconKey,nil]错误:nil],但是与NSURLEffect

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

我已经尝试检查
[NSURL resourceValuesForKeys:[NSArray array with objects:NSURLCustomIconKey,NSURLEffectiveIconKey,nil]错误:nil]
,但是与
NSURLEffectiveIconKey
关联的对象始终为非nil,
NSURLCustomIconKey
即使我调用
[NSURL setResourceValue:myNonNilImage forKey:NSURLCustomIconKey错误:nil]

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

的文档说明
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"];
}

希望这有助于

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;
}

向我们展示您的真实代码,以便更好地了解当前发生的情况我称之为
[[NSWorkspace sharedWorkspace]setIcon:myImage for File:myFilename选项:0]
每次我加载要设置自定义图标的文件时。问题是如何知道此文件是否已设置图标,以便避免重置。是的。您在问题中粘贴了一些代码片段,您说您尝试过。请发布您尝试过的完整代码,以便我们能够获得一个合理的想法。目前我正在使用<代码>如果([[[[NSWorkspace sharedWorkspace]图标信息文件:myFilename]表示]计数]>4)[[NSWorkspace sharedWorkspace]设置图标:myImage for文件:myFilename选项:0];因为显然myImage只有4个表示形式。但这对我来说似乎是一个糟糕的解决方法。这确实是一个非常糟糕的解决方法。我自己不敢相信它。谢谢你的建议,但这个解决方案对我不起作用,因为我必须为我想要设置图标的每个文件设置默认值,并且图标可能有一个我已经准备好另一台Mac了。非常感谢你,你让我开心!;-)