Запись метаданных Центра внимания в файлы на OS X (определенно kMDItemDisplayName)

Я вижу, что на это ранее отвечал Кен Т., но у меня есть случай, когда код работает, и вызов setxattr() возвращает 0, но элемент, который я хочу изменить, не изменяется.

В частности, я пытаюсь изменить атрибут метаданных kMDItemDisplayName, и мой вызов выглядит следующим образом (смоделировано после образца, опубликованного Кеном Т):

[Примечание: параметр "name" ниже - строка NSString *]

rc = setxattr([pathString cStringUsingEncoding:NSUTF8StringEncoding],
                 "kMDItemDisplayName",
                 [name cStringUsingEncoding:NSUTF8StringEncoding],
                 [name lengthOfBytesUsingEncoding:NSUTF8StringEncoding],
                 0,
                 0);

Выполнение mdls для рассматриваемого файла показывает, что атрибут kMDItemDisplayName присутствует, но я не могу заставить его изменить что-либо, кроме фактического имени файла (которое я предполагаю, является поведением по умолчанию).

Я что-то неправильно понимаю о том, как setxattr() должен работать?

Любая помощь очень ценится.

О, кстати, почему я пытаюсь это сделать? Похоже (из изучения того, как Yojimbo Bare Bones делает что-то), что Spotlight использует значение kMDItemDisplayName для перечисления файлов в меню результатов поиска Spotlight в поисковике, что я хотел бы реализовать в своем приложении.

Спасибо!


Хейуууу... подожди минутку...

Выполнение xattr -l из командной строки показывает, что, насколько известно xattr, существует атрибут с именем kMDItemDisplayName, и я задаю для него значение... Однако mdls в том же файле по-прежнему показывает атрибут kMDItemDisplayName в качестве имя файла.

Нужно ли спрашивать о Launch Services вместо xattr?


1 ответ

ХОРОШО. Пройдя немного побольше и прочитав больше документации Apple, я понял, что мне нужно делать. Я отвечаю на свой вопрос в надежде, что эта информация может быть полезна кому-то еще в будущем.

Поскольку мне пришлось написать свой собственный mdimporter для поддержки формата файлов моего приложения, я подумал, что попробую добавить элемент имени kMDItemDisplay в хранилище метаданных во время импорта метаданных.

К моему изумлению и восторгу, это сработало с первой попытки!

Итак, ответ таков: если вы хотите перезаписать или добавить пользовательские типы kMDItem*, вы делаете это во время импорта метаданных, используя импортер Spotlight.

Надеюсь, что кто-то найдет это полезным!

Другие вопросы по тегам