1

我需要在 c 程序中获取文件的用户标签。我知道“mdls -name kMDItemUserTags FILENAME”命令可以获取此详细信息。但我需要用c代码来做。有什么方法可以直接获取值,而不是运行这个命令和解析。

4

1 回答 1

0

您可以通过使用指定颜色的NSURL 资源密钥来完成。 NSURLLabelColorKeyNSColor

因此它不能在 C本身中完成,但是您可以编写一个带有 C 函数入口点的 Objective-C 实现文件,以便可以从 C 调用它(正如@Alex MDC 在您可以使用的评论中指出的那样,CoreFoundation并在C 直接,但我总是倾向于Foundation尽可能地使用,因为使用 ARC 时更容易使用)。

GivenNSColor用于指定颜色,您需要创建一个struct来保存 RGB 值并在它struct和您NSColor自己之间进行转换。

类似(未经测试):

OSXFileLabelColour.h:

#ifdef __cplusplus
extern "C" {
#endif

typedef struct {
    int isSet;          // if 0 then no colour set
    float r;
    float g;
    float b;
} LabelColour;

/* Return 1 for success or 0 for failure */
extern int getFileLabelColour(const char *filename, LabelColour *colour);

#ifdef __cplusplus
}    // extern "C"
#endif

OSXFileLabelColour.m:

#import <Foundation/Foundation.h>
#import "OSXFileLabelColour"

int getFileLabelColour(const char *filename, LabelColour *colour)
{
    int retval = 0;
    NSURL *url = [NSURL fileURLWithPath:@(filename)];
    if (url) {
        NSColor *nscolor = nil;
        NSError *error = nil;
        if ([url getResourceValue:&nscolor
                           forKey:NSURLLabelColorKey
                            error:&error]) {
            if (nscolor) {
                CGFloat r, g, b, a;
                [nscolor getRed:&r green:&g blue:&b alpha:&a];
                colour->isSet = 1;
                colour->r = r;
                colour->g = g;
                colour->b = b;
            } else {
                colour->isSet = 0;
            }
            retval = 1;                
        } else {
            NSLog(@"Failed to get colour label for file '%s': %@", filename, [error localizedDescription]);
        }
    } else {
        NSLog(@"Failed to create URL for file '%s'", filename);
    }
    return retval;
}
于 2014-09-11T10:11:22.010 回答