Откуда берутся ИМП?

Я прочитал много сообщений в блогах и SO-вопросов о унифицированных идентификаторах типов и о том, как OS X обрабатывает типы файлов. Однако есть еще кое-что, чего я просто не понимаю:

  • Как система создает UTI для каждого файла? Как разработчик я пассивно объявляю UTI для своего типа файла, но система отвечает за назначение UTI для каждого совпадающего файла. Мое текущее впечатление таково, что UTI создаются Finder на лету в соответствии с расширением файла.

  • Где хранятся UTI на уровне файловой системы? Я узнал, что UTI можно отобразить с помощью команды mdls. Означает ли это, что UTI хранится в метаданных Spotlight? Что делать, если Spotlight выключен?

  • Верно ли, что нет API для ручного добавления или изменения UTI для определенного файла?


person codingFriend1    schedule 05.06.2013    source источник
comment
Вы читали ссылку на Apple? developer.apple.com/library/mac / # documentation / FileManagement /   -  person Robert Harvey    schedule 05.06.2013
comment
Ссылку конечно прочитал. Но это только объясняет, как структурированы UTI и как объявлять их в вашем приложении. Я хочу знать, как они работают на уровне файловой системы. Я обновил свой вопрос, чтобы было немного понятнее.   -  person codingFriend1    schedule 06.06.2013


Ответы (1)


На самом деле в этом не так уж много волшебства. Вы задали несколько разных вопросов, поэтому я постараюсь дать вам каждый из них:

Как система создает UTI для каждого файла?

Launch Services поддерживает базу данных всех приложений (и некоторых других типов пакетов) на вашем Mac и соответствующей информации, объявленной в их файлах Info.plist. Он обновляет эту информацию автоматически - я думаю, у него есть демон, отслеживающий файловую систему, чтобы следить за изменениями в приложениях, но я не знаю подробностей. Что я знаю, так это то, что вы можете попросить инструмент под названием lsregister сбросить для вас всю базу данных. В Терминале на Mountain Lion:

$ /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump

Различные UTType функции также обращаются к этой базе данных Launch Services (хотя я не уверен, делают ли они это напрямую или общаются с каким-то демоном, который делает это за них).

Где хранятся UTI на уровне файловой системы?

Что ж, фактическая база данных Launch Services, похоже, находится где-то по-разному на каждом Mac. По моему, он находится на /private/var/folders/mf/1xd7vlw90dj5p4z1r5f800bc000101/C/com.apple.LaunchServices-0371025.csstore. (По крайней мере, lsregister держит этот файл открытым, пока он работает; я не совсем уверен, что в нем, но предполагаю, что это база данных.)

Однако это всего лишь список заявленных ИМП. К данному файлу не прикреплено поле UTI. Когда вы запрашиваете у Cocoa UTI файла - например, через -[NSWorkspace typeOfFile:error:] или -[NSURL getResourceValue:forKey:error:] - он фактически извлекает расширение пути из имени файла и затем вызывает UTTypeCreatePreferredIdentifierForTag() для получения соответствующего UTI. (Это немного сложнее, потому что он также смотрит на такие вещи, как то, ведет ли путь к каталогу, файлу устройства или чему-то еще, но это основная идея.)

Означает ли это, что UTI хранится в метаданных Spotlight? Что делать, если Spotlight выключен?

Spotlight хранит UTI файлов в своей базе данных, но это только для того, чтобы он мог быстро искать и фильтровать по типу. Как и все остальное в индексе Spotlight, эта информация не является канонической; он просто используется для быстрого поиска данных, которые на самом деле хранятся в другом месте. Если вы выключите Spotlight, ничего страшного, от этого больше ничего не зависит.

Верно ли, что нет API для добавления или изменения UTI для определенного файла вручную?

Да, потому что этот UTI вычисляется во время выполнения на основе другой информации о файле. Изменение UTI файла имеет такой же смысл, как и изменение длины его имени - вы не можете сделать это, не изменив само имя.

person Becca Royal-Gordon    schedule 02.08.2013
comment
Спасибо! Это все, что я хотел знать. - person codingFriend1; 02.08.2013