2013-07-23 1 views
3

Mac OS X Finder использует концепцию «пакеты», чтобы сделать содержимое определенных папок непрозрачным для пользователя. Я использую os.walk() для перечисления дерева каталогов, и я хочу пропустить перечисление на таких пакетах, как пакеты приложений.Определите каталоги, которые являются пакетами в Mac OS X с Python

Утилита командной строки mdls может использоваться для проверки того, установлен ли com.apple.package в атрибуте kMDItemContentTypeTree. Единственный/лучший способ определить, стоит ли папке упаковать в os.system и использовать mdls после обнаружения того, что ОС действительно является darwin?

В отличие от этого решения, похоже, зависит от метаданных Spotlight, которые, как я понимаю, заполнены от самих файлов/каталогов. Это заставляет меня задаться вопросом, есть ли способ проверить, является ли каталог пакетом за пределами mdls. Возможно, я что-то упустил.

+1

Если вы решите пойти с 'mdls', назовем его с [модуль подпроцесса] (http://docs.python.org/2.7/library/subprocess.html#replacing -os-system) вместо 'os.system'. – nofinator

+0

Спасибо за это, @nofinator –

ответ

2

OS X packages (and bundles) обычно определяются их расширением. Просто создайте каталог с расширением .app, чтобы увидеть его в виде (разбитого) приложения в Finder.

В official documentation перечислены следующие способы определения связки:

Искатель считает каталог, чтобы быть пакет, если какой-либо из следующих условий:

  • каталог имеет известное имя файла расширение: .app, .bundle, .framework, .plugin, .kext и т. д.
  • В каталоге есть расширение, которое некоторые другие заявки на изобретения представляют тип упаковки; см. «Пакеты документов».
  • В каталоге установлен пакетный бит.

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

Простейшим способом обнаружения пакетов является обнаружение этих расширений. Быстрый и грязный способ - просто искать жесткий список расширений, используя приведенную выше документацию в качестве руководства.

Следующим шагом является запрос ОС, если данное расширение было зарегистрировано как пакет документов. См How to check whether directories with a given extension are shown by the Finder as a package?

Для обнаружения бита пакета на каталогах, вы должны будете использовать xattr library, чтобы получить ключ u'com.apple.FinderInfo', а затем использовать Finder.h header info декодировать двоичные данные, возвращаемые; kHasBundle флаг 0x2000:

attrs = xattr.getxattr('/path/to/dir', u'com.apple.FinderInfo') 
ispackage = bool(ord(attrs[8]) & 0x20) # I *think* this is correct; works for hidden dirs and & 0x40 
+0

Суть проблемы (и способ эффективной реализации) требует возможности запросить систему _once_ для списка всех расширений, которые должны рассматриваться как пакеты документов, и их не видно быть простым способом сделать это даже в ссылке, которую вы предоставили на другой вопрос, если я не пропущу что-то.Эта ссылка описывает метод тестирования отдельных расширений против системы, который похож на стрельбу в темноте. Тем не менее, вы немного помогли мне с кодом xattr и бит kHasBundle. –

+0

Я перечитал эту ссылку, которую вы предоставили, и, похоже, не очень элегантный способ сделать это в Objective-C, не говоря уже о Python! –

+1

Нет, мне также не удалось найти лучший метод. Похоже, инструмент 'mdls' просто проще. –

 Смежные вопросы

  • Нет связанных вопросов^_^