Файл, из которого происходит IconRef - PullRequest
1 голос
/ 02 марта 2009

Есть ли способ узнать .icns-файл, на который ссылается IconRef или который был загружен? Или даже идентификатор содержащего пакета, если он есть?

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

Вопрос, на который я пытаюсь ответить: «Откуда появляется значок Finder для файла X?» Обратите внимание, что меня интересует происхождение значка в файловой системе, а не данные изображения значка. Насколько я могу судить, работа идет от пути к файлу к иконке - например. GetIconRefFromFileInfo и NSWorkspace.iconForFile - довольно непрозрачны.

Я открыт для недокументированных / частных решений, если это то, что нужно.

@ millenomi: Да, в этом упражнении стоит избегать значков Apple.

Ответы [ 3 ]

1 голос
/ 02 марта 2009

Launch Services имеет частные API для обхода своей базы данных регистрации пакетов, и вы можете найти файлы .icns таким образом. Вы можете просмотреть эту информацию с помощью инструмента lsregister в LaunchServices.framework / Support; используйте lsregister -dump для просмотра всей базы данных.

Предупреждение об обязательном недокументированном здоровье: если вы используете эти функции, ваше приложение рано или поздно сломается. (А синтаксический анализ вывода команды lsregister -dump еще хуже!)

Кроме того, вы, кажется, знаете об этом, но я все равно укажу на это: не все значки происходят из файла .icns. Некоторые из них находятся в файлах ресурсов, например, в приложении Carbon старого стиля. Другой случай - пользовательские (вставленные в окно информации Finder) значки, которые являются одним или несколькими ресурсами с идентификатором -16455. (Классические значки находятся в нескольких ресурсах типов «icl8», «ics8» и т. Д., Тогда как современные значки находятся в одном ресурсе типа «icns».)

К сожалению, я не играл с этим частным API, поэтому не могу быть более конкретным.

0 голосов
/ 02 марта 2009

Отвечаю сам ...

Следующее не решает первоначальный вопрос - выяснить, какой файл находится за IconRef, - но оно достигает моей цели - избегать значков, принадлежащих Apple, без полного отказа от значков, специфичных для файлов.

Хитрость заключается в том, чтобы определить, какое приложение откроет файл, и предположить, что значок файла будет предоставлен этим приложением.

Используйте LSGetApplicationForItem, чтобы узнать, какое приложение будет использоваться для открытия файла. Если это не приложение Apple (проверьте идентификатор пакета), я предполагаю, что можно безопасно использовать значок файла (как возвращено GetIconRefFromFileInfo).

Есть также несколько особых случаев, с которыми мне нужно иметь дело - избегать общих значков документов, папок, приложений и пакетов, а также «специальных» папок, таких как «Документы» и «Музыка».

0 голосов
/ 02 марта 2009

Это происходит потому, что после загрузки система не сохраняет ссылку на файл значка, из которого пришла иконка.

Лучше всего искать, к сожалению, *.icns файлы в /System. Обратите внимание, что эти значки находятся под авторским правом Apple, и вы не должны использовать их повторно (кроме случаев, когда они загружаются через их API).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...