Запись метаданных Центра внимания в файлы на 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.
Надеюсь, что кто-то найдет это полезным!