На самом деле в этом не так уж много волшебства. Вы задали несколько разных вопросов, поэтому я постараюсь дать вам каждый из них:
Как система создает 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