OSX Mavericks получают теги файла в программе c

Мне нужно получить теги пользователя для файла в программе c. Мне известна команда "mdls -name kMDItemUserTags FILENAME", чтобы получить эту информацию. Но мне нужно сделать это в коде c. Есть ли способ, с помощью которого я могу получить значения напрямую, вместо запуска этой команды и анализа.

1 ответ

Решение

Вы можете сделать это через NSURL Ключ ресурса NSURLLabelColorKey который использует NSColor указать цвет.

Поэтому это не может быть сделано на языке C как таковом, однако вы можете написать файл реализации Objective C с точкой входа функции C, чтобы его можно было вызывать из C (как отмечено @Alex MDC в комментариях, которые вы можете использовать CoreFoundation и делать это в C напрямую, но я бы всегда отдавал предпочтение Foundation где это возможно, так как это легче использовать при использовании ARC).

Дано NSColor используется для указания цвета, вам нужно создать 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;
}
Другие вопросы по тегам