OSX Mavericks在c程序中获取文件的标签

OSX Mavericks get tags of a file in c program

本文关键字:获取 文件 标签 程序 Mavericks OSX      更新时间:2023-10-16

我需要在c程序中获得文件的用户标签。我知道"mdls -name kMDItemUserTags FILENAME"命令来获取此详细信息。但我需要做它在c代码。是否有任何方法可以直接获得值,而不是运行此命令并解析。

您可以通过NSURL 资源键 NSURLLabelColorKey使用NSColor来指定颜色。

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

给定NSColor是用来指定颜色的,你需要创建一个struct来保存RGB值,并在structNSColor之间进行转换。

类似于(未经测试):

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