Повернути Асоціацію типів файлів


12

Я час від часу працюю з пакетами iTunes Music Store. Ці пакети мають .itmspрозширення. Мовляв .app, .itmspпо суті є каталогом контейнерів. .itmspпапки містять XML та мультимедійні файли.

Останнє оновлення Xcode та / або Mac OS X (Xcode 4.6.1 на Mac OS 10.8.3) викрало асоціацію файлів для каталогів з .itmspрозширенням. Раніше до них ставилися як до звичайних папок - не потрібно двічі клацнути, щоб побачити всередині. Тепер я повинен двічі клацнути по них, щоб взаємодіяти з ними. Коли я це роблю, програма під назвою Application Loader намагається їх відкрити. Для того, щоб побачити всередині, я повинен клацнути правою кнопкою миші та вибрати "Показати зміст пакета". Я маю справу з тисячами цих файлів у будь-який момент часу, тому це не спрацює.

Я спробував змінити або видалити асоціацію типів файлів за допомогою Get Info та RCDefaultApp. Ні один не працює. Видалення асоціації типів файлів просто перетворює .itmspкаталоги в порожні файли. Це також видаляє Application Loader.app повністю. В будь-якому випадку я все ще не можу переглядати вміст без клацання правою кнопкою миші.

Раніше прийнята відповідь деякий час працювала у пригоді: lsregister -u /Applications/Contents/Applications/Application\ Loader.app/вона припинила свою роботу, оскільки я оновив Xcode та / або Mac OS X. Якщо у вас встановлений Xcode, ви зможете перевірити це самостійно, назвавши каталог foo.itmsp.

Як зробити так, щоб .itmspфайли знову трактувалися як папки?


Ви спробували перетягнути і випустити файл на піктограму додатка Xcode і побачити, чи він робить те, що ви хочете?
MrDaniel

Дякую за пропозицію. Це не стосується проблеми, тому я спробую відредагувати своє запитання, щоб уточнити свій намір.
michaelmichael

1
Яку версію ОС X ви працюєте? Яка версія Xcode?
Старий Про

Я видалив свій відповідь, який видалив типи з CFBundleDocumentTypes і вбив на базі даних служби запуску. Це працює деякий час, але, здається, знову підтверджує себе в якийсь момент.
markhunte

Відповіді:


11

Проблема: папки .itmsp відображаються у вигляді файлів

Finder трактує .itmsp папки як пакети , тобто як би це один файл. Наприклад, у вікні стовпця все, що міститься у папці .itmsp, є невидимим, відображається лише значок документа:

введіть тут опис зображення

Finder вважає каталог пакетом, якщо виконується будь-яке з наведених нижче умов (з Посібника з програмування пакетів ):

  1. У каталозі є відоме розширення назви файлів: .app, .bundle, .framework, .plugin, .kext і так далі (як визначено в /System/Library/CoreServices/CoreTypes.bundle/Contents/Info.plist. Це бінарний список), відкрийте його з Xcode:) open -a Xcode Info.plist.

  2. У каталозі є розширення, яке в деяких інших заявках додатків представляє тип пакету (шукайте com.apple.packageу висновку, mdls -name kMDItemContentTypeTree <foldername>щоб дізнатися.)

  3. У каталозі встановлено біт пакета (якщо він GetFileInfo -ab <foldername>повертається 1, він встановлюється.)

Випадок 2. стосується папки .itmsp: Application Loader.appтип експорту com.apple.itunes-producer.itmspта встановлює його відповідно до com.apple.package:

$ mkdir foo.itmsp
$ mdls -name kMDItemContentTypeTree foo.itmsp/
kMDItemContentTypeTree = (
    "com.apple.itunes-producer.itmsp",
    "com.apple.package",
    (...)
)
$ grep -B 5 -A 8 com.apple.package /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Info.plist 
    <key>UTExportedTypeDeclarations</key>
    <array>
        <dict>
            <key>UTTypeConformsTo</key>
            <array>
                <string>com.apple.package</string>
                <string>public.composite-content</string>
            </array>
            <key>UTTypeDescription</key>
            <string>iTunes Package</string>
            <key>UTTypeIconFile</key>
            <string>ITMSP.icns</string>
            <key>UTTypeIdentifier</key>
            <string>com.apple.itunes-producer.itmsp</string>

Рішення: повторно оголосити тип com.apple.itunes-producer.itmsp

Рішенням може бути повторне оголошення типу com.apple.itunes-producer.itmspта розширення itmspяк папки та змушення Launch Services використовувати декларацію модифікованого типу.

Важлива примітка:

Хоча воно надійно вирішує проблему ОП, запропоноване рішення, застосоване до інших пакетів, не відображає їх як папки.

Я з'ясував, що запропоноване рішення, здається, працює лише з типами файлів, оголошеними програмами, розташованими в нестандартному шляху до програми.

Це справа з тим Application Loader.app, що знаходиться в /Applications/Xcode.app/Contents/Applications/.

Якщо вас цікавить часткове рішення, перевірте кінець цієї відповіді.

Щоб Finder відображав папки .itmsp як папки, виконайте наступні дії:

  1. Відкрийте Автоматизатор у папці Програми та виберіть Застосування :

    введіть тут опис зображення

  2. Виберіть утиліти у списку бібліотеки, виберіть Запустити скрипт оболонки та перетягніть його до області праворуч:

    введіть тут опис зображення

  3. Замініть вміст сценарію за замовчуванням на exit 0:

    введіть тут опис зображення

  4. Збережіть програму як itmspOpener:

    введіть тут опис зображення

  5. Закрити Автоматизатор.

  6. Виберіть itmspOpener.appі покажіть його вміст:

    введіть тут опис зображення

  7. Знайдіть Зміст> Info.plist та відкрийте його улюбленим редактором:

    введіть тут опис зображення

  8. Замініть ці розділи на Info.plist:

    <key>CFBundleDocumentTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeExtensions</key>
            <array>
                <string>itmsp</string>
            </array>
            <key>CFBundleTypeName</key>
                <string>itmsp folder</string>
            <key>CFBundleTypeRole</key>
                <string>Viewer</string>
            <key>CFBundleTypeIconFile</key>
                <string>folder</string>
            <key>LSTypeIsPackage</key>
                <false/>
            <key>LSHandlerRank</key>
                <string>Owner</string>
        </dict>
    </array>
    (...)
    <key>UTExportedTypeDeclarations</key>
    <array>
        <dict>
            <key>UTTypeConformsTo</key>
            <array>
                <string>kUTTypeDirectory</string>
            </array>
            <key>UTTypeDescription</key>
            <string>itmsp folder</string>
            <key>UTTypeIconFile</key>
            <string>folder.icns</string>
            <key>UTTypeIdentifier</key>
            <string>com.apple.itunes-producer.itmsp</string>
            <key>UTTypeTagSpecification</key>
            <dict>
                <key>public.filename-extension</key>
                <string>itmsp</string>
            </dict>
        </dict>
    </array>
    

    Примітка: чому kUTTypeDirectoryзамість public.directoryin UTExportedTypeDeclarations? З документації Apple : Важливо: Під час використання визначених системою UTI у своєму коді слід використовувати константи, визначені UTCoreTypes.hв рамках програми Launch Services, коли вони доступні, а не фактичні рядки UTI. Наприклад, передайте kUTTypeApplication, а не "com.apple.application". "Оголошені системою уніфіковані ідентифікатори типу" перераховують ці константи на додаток до рядків UTI.

  9. Зв’яжіть файл .itmsp itmspOpenerі натисніть кнопку Change All...:

    введіть тут опис зображення

  10. Скидання бази даних служб запуску:

    $ lsregister -kill -r -domain local -domain system -domain user
    

    (на ОС X 10.8 lsregisterзнаходиться в /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/.)

  11. Створіть папку .itmsp та перелічіть її властивості:

    $ mkdir foo3.itmsp
    $ mdls -name kMDItemContentTypeTree foo3.itmsp/
    kMDItemContentTypeTree = (
        "public.folder",
        "public.directory",
        "public.item"
    )
    

    Оскільки база даних Launch Services була скинута, зараз Finder показує .itmsp папки як папки.

  12. Відкрийте , itmspOpener.appщоб завантажити свій файл Plist і реєстрації com.apple.itunes-producer.itmsp:

    $ open ~/Desktop/itmspOpener.app
    
  13. Початок Application Loader.app:

    $ open '/Applications/Xcode.app/Contents/Applications/Application Loader.app'
    

    Папка foo3.itmspвсе одно повинна відображатися у вигляді папки.

  14. Перевірте властивості папки ще раз:

    $ mdls -name kMDItemContentTypeTree foo3.itmsp/
    kMDItemContentTypeTree = (
        "public.directory",
        "public.item",
        "public.content"
    )
    

    com.apple.package не додано до атрибутів метаданих папки, тому Finder все ще відображає папки .itmsp як папки!

Автоматизоване рішення: відображення .itmsp папок як папок після входу

Щоб відобразити папки .itmsp як папки після входу:

  1. Створіть itmspOpener.appта змініть її, Info.plistяк описано вище.

  2. Створіть за /usr/local/bin/itmspTypeLoaderдопомогою цього вмісту (змінна itmspOpenerточка вказує на місце, де itmspOpener.appпроживає, змінюйте за необхідності):

    #!/bin/bash
    
    itmspOpener="/Users/jaume/Applications/itmspOpener.app/"
    
    echo "$(date): Starting" > /tmp/itmspTypeLoader.log
    sleep 15
    echo "$(date): Deleting Launch Services database" >> /tmp/itmspTypeLoader.log
    /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -kill -r -domain local -domain system -domain user >> /tmp/itmspTypeLoader.log
    sleep 15
    echo "$(date): Starting $itmspOpener" >> /tmp/itmspTypeLoader.log
    open $itmspOpener >> /tmp/itmspTypeLoader.log
    sleep 1
    echo "$(date): Starting Application Loader.app" >> /tmp/itmspTypeLoader.log
    open "/Applications/Xcode.app/Contents/Applications/Application Loader.app/"
    
    # Wait until process "Application Loader.app" exists
    while [ $(ps -ef|grep -v grep|grep -c "Application Loader") -ne 1 ]; do
        sleep 1
        echo "$(date): Waiting" >> /tmp/itmspTypeLoader.log
    done
    # Send TERM signal
    kill -TERM $(ps -ef|grep "Application Loader"|grep -v grep|awk "{print \$2}")
    if [ $? -eq 0 ]; then
        echo "$(date): Application Loader killed" >> /tmp/itmspTypeLoader.log
    else
        echo "$(date): Application Loader could not be killed" >> /tmp/itmspTypeLoader.log
    fi
    echo "$(date): Exiting" >> /tmp/itmspTypeLoader.log
    

    І sleep 15до, і після бігу lsregisterмають надзвичайно важливе значення. Якщо ви не бачите бажаного результату, спробуйте різні затримки.

  3. Створіть за /usr/local/bin/itmspTypeLoaderLauncherдопомогою цього вмісту:

    #!/bin/bash
    
    # $1 returns the short name of the user who is logging in
    su - $1 -c /usr/local/bin/itmspTypeLoader &
    
  4. Встановіть обидва сценарії виконується:

    $ sudo chmod a+x /usr/local/bin/itmspTypeLoader /usr/local/bin/itmspTypeLoaderLauncher 
    
  5. Встановити /usr/local/bin/itmspTypeLoaderLauncherяк гачок для входу :

    $ sudo defaults write com.apple.loginwindow LoginHook /usr/local/bin/itmspTypeLoaderLauncher
    
  6. Перезавантажте, щоб зміни набрали чинності. Після входу ви повинні побачити таке:

    введіть тут опис зображення

    і lsregister -dumpповинен виявити, що itmspOpener.appросійська мова UTExportedTypeDeclarationsмає перевагу над Application Loader.app:

    $ lsregister -dump | less
    bundle  id:            24748
            path:          /Users/jaume/Desktop/itmspOpener.app/
            name:          itmspOpener
            (...)
            flags:         apple-internal  relative-icon-path  ui-element  has-min-sys-version-by-arch  hi-res-capable  user-can-change-hi-res-mode  
            item flags:    container  package  application  extension-hidden  native-app  scriptable  services  x86_64  
            (...)
            --------------------------------------------------------
            type    id:            33796
                    uti:           com.apple.itunes-producer.itmsp
                    description:   itmsp folder
                    flags:         exported  active  apple-internal  trusted  
                    icon:          Contents/Resources/folder.icns
                    conforms to:   kuttypedirectory
                    tags:          .itmsp
            --------------------------------------------------------
            (...)
    bundle  id:            24600
            path:          /Applications/Xcode.app/Contents/Applications/Application Loader.app/
            name:          Application Loader
            (...)
            flags:         apple-internal  relative-icon-path  hi-res-capable  user-can-change-hi-res-mode  
            item flags:    container  package  application  extension-hidden  native-app  i386  x86_64  
            (...)
            --------------------------------------------------------
            type    id:            33832
                    uti:           com.apple.itunes-producer.itmsp
                    description:   iTunes Package
                    flags:         exported  inactive  apple-internal  trusted  
                    icon:          Contents/Resources/ITMSP.icns
                    conforms to:   com.apple.package, public.composite-content
                    tags:          .itmsp
            --------------------------------------------------------
    

    Чи бачите ви встановлений inactiveпрапор у експорті типу Application Loader.app? Ми перемогли програму Loader.

Тест на кислотність: папки .itmsp як і раніше відображаються як такі після оновлення iTunes

Я нещодавно оновив Xcode:

введіть тут опис зображення

і може підтвердити, що папки .itmsp були показані як папки під час оновлення:

введіть тут опис зображення

і після:

введіть тут опис зображення

Часткове рішення: У пакеті буде показано вміст при подвійному натисканні

Як було раніше зауважено, описана вище процедура не працюватиме з довільними папками, які Finder відображає у вигляді пакетів.

Однак якщо ви просто хочете мати можливість двічі клацнути пакет, щоб відкрити його, є спосіб зробити це за допомогою одного bashсценарію та Автоматизатора:

  • Сценарій створює приховану тимчасову папку всередині пакета, розкриває її у Finder (таким чином розкриваючи пакунок як папку), а потім видаляє тимчасову папку.

    Примітка:

    Сценарій може замість цього створити прихований тимчасовий файл. Однак я вважаю за краще створити папку, оскільки rmdirвидаляє лише порожні папки, тоді як rmвидаляє будь-який файл, тож якщо з якоїсь причини. скрипт спричиняє шкоду, видаляються лише порожні папки, що, мабуть, не так вже й погано, як якщо б файли були видалені.

  • Автоматизатор поєднує сценарій у програму, яка буде асоційована з файлами пакунків.

Це етапи створення такої програми. Я буду використовувати .itmsp файли як приклад типу пакету в поясненні нижче:

  1. Відкрийте Автоматизатор у папці Програми та виберіть Застосування :

    введіть тут опис зображення

  2. Виберіть утиліти у списку бібліотеки, виберіть Запустити скрипт оболонки та перетягніть його до області праворуч:

    введіть тут опис зображення

  3. Set Pass вхід в якості аргументів :

    введіть тут опис зображення

  4. Замініть вміст сценарію за замовчуванням таким:

    for f in "$@"; do
        # If not dealing with a directory, exit
        if [ ! -d "$f" ]; then exit; fi
        # Create a temporary directory inside the itmsp "file"
        tmpdir="$f/.itmspOpener$$"
        if mkdir $tmpdir; then
            # Reveal in Finder
            open -R $tmpdir
            # Delete temporary file
            rmdir $tmpdir
        fi
    done
    
  5. Збережіть програму як itmspOpener:

    введіть тут опис зображення

  6. Закрити Автоматизатор.

Тепер у вас є програма, яка може відкривати .itmsp файли як папки, якщо з нею пов’язана.

Існує косметична проблема: як відомо, пов’язані файли матимуть стандартний білий значок документа:

введіть тут опис зображення

Давайте також це вирішимо:

  1. Переконайтесь, що Automator закритий.

  2. Виберіть itmspOpener та покажіть його вміст:

    введіть тут опис зображення

  3. Знайдіть Зміст> Info.plist та відкрийте його улюбленим редактором:

    введіть тут опис зображення

  4. Замініть значення для цього ключа в CFBundleDocumentTypesмасиві:

    <key>CFBundleTypeName</key>
    <string>itmsp folder</string>
    

    і додайте цей ключ:

    <key>CFBundleTypeIconFile</key>
    <string>folder</string>
    

    Тепер розділ виглядає так:

    введіть тут опис зображення

  5. Перейдіть до Finder, виберіть папку, натисніть I, виберіть піктограму папки у верхньому лівому куті та скопіюйте її за допомогою C:

    введіть тут опис зображення

  6. Відкрийте попередній перегляд та виберіть «Файл»> «Нове» з буфера обміну. Збережіть файл як folder.icns:

    введіть тут опис зображення

  7. Скопіюйте folder.icnsу itmspOpener/Contents/Resources:

    введіть тут опис зображення

  8. Зв’яжіть файл .itmsp itmspOpenerі натисніть кнопку Change All...:

    введіть тут опис зображення

Піктограма файлів .itmsp повинна змінитися в папку, або, принаймні, я так вважав: на жаль, це було не так. Тому я перемістив додаток itmspOpener в інше місце (я створив тимчасову папку на своєму робочому столі, перемістив її туди і назад на свій робочий стіл). Це оновило інформацію про іконку в Finder:

введіть тут опис зображення

Тепер двічі клацніть файл .itmsp і дивіться, як він відкривається як папка:

введіть тут опис зображення


Це дуже вражає ... Але, здається, є одна проблема, що нігтять: якщо Finder знаходиться у вікні стовпця (мій бажаний тип подання), все, що міститься в .itmspпапці, є невидимим. Я не можу розібратися чому, але це так. До того ж, якби у мене були барабани, вам не доведеться двічі клацнути файл, щоб побачити всередині, але добре.
michaelmichael

1
Ти правий. Я не очікував, що ви використовуєте перегляд стовпців, хоча мушу сказати, що це має сенс для роботи з тисячами папок .itmsp. Але я знайшов спосіб вирішити проблему, тобто змусити Finder розглянути папки .itmsp як папки. Погляньте на мою редакцію (або перейдіть безпосередньо до останнього абзацу, який називається Рішення, але не забудьте змінити спочатку itmspOpener's Info.plist, як описано в абзаці Трюк.)
jaume

Неймовірно! Дякую за відповідь. Це дуже цікавий погляд на деякі речі, які змушують галочки Finder та OS X.
michaelmichael

Дякую, я радий, що ти знайшов це корисним! (Я відредагую відповідь пізніше, щоб поліпшити читальність і надати їй більше структури.)
jaume

Нарешті я знайшов час, щоб відредагувати відповідь. Я упорядкував абзаци та додав доказів того, що рішення, пояснене у моїй відповіді, не захищене від оновлень iTunes.
jaume

7

Одним із варіантів було б скасувати реєстрацію навантажувача додатків lsregister -u /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/, але він знову реєструється, якщо він відкритий, якщо база даних служб запуску перебудована або, можливо, оновлено Xcode.

Ви також можете прокоментувати записи в словниках CFBundleDocumentTypes та UTExportedTypeDeclarations /Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Info.plistта виконати lsregister -f /Applications/Xcode.app/Contents/Applications/Utilities/Application\ Loader.app/. Це не скасовує підпис коду Xcode, але зміни можуть бути замінені оновленнями.

Повний шлях до lsregister знаходиться /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregisterв 10.5 і пізніше.


Ви впевнені, що після реєстрації програми після зміни її Info.plistбуде відреєстровано типи файлів, які ви видалили зі списку? Я можу уявити, як це працює, і я можу легко уявити, що він провалюється. теж.
Старий Про

@OldPro Так, lsregister -u $app && lsregister $appздається, застосовує зміни до Info.plist принаймні в цьому випадку.
Лрі

Це чудова відповідь - майте на увазі, що наступного разу, коли ви оновите Xcode - ви, можливо, отримаєте завантажувач додатків, який реєструє типово, CFBundleDocumentTypesщоб ви могли просто видалити цей "інструмент", коли він з'явиться, якщо він вам не потрібен та / або шина модифікації.
bmike

2

Ось відповідний уривок з компанії Apple documenation про пучках ( курсив додано )

Як система ідентифікує пакети та пакети

Finder розглядає каталог як пакет, якщо виконується будь-яке з наведених нижче умов:

  • У каталозі є відоме розширення назви файлів: .app, .bundle, .framework, .plugin, .kext тощо.
  • У каталозі є розширення, згідно з яким деякі інші заявки додатків представляють тип пакету; див. " Пакети документів ".
  • У каталозі встановлено біт пакета.

Кращим способом визначення пакету є надання каталогу каталогу відомого розширення імені файлу. Здебільшого, Xcode піклується про це для вас , надаючи шаблони, які застосовують правильне розширення. Все, що вам потрібно зробити, - це створити проект Xcode відповідного типу.

Майже напевно Xcode представляє, що він заявляє, що .itmspпредставляє тип пакету, як описано в Document Packages . Тож можливо видалення цього розширення з Xcode Info.plistбуде виконувати трюк, але я підозрюю, що після того, як Finder помітив цю асоціацію, вилучення її з Xcode не скасує її. Які "рекомендовані програми" ви отримуєте, клацнувши правою кнопкою миші на "Відкрити за допомогою ..."? Вам потрібно перевірити всі їхні Info.plists.

Я пропоную ознайомитись, чи зможете ви піти від lsregister -uскасування реєстрації будь-яких заявок, які заявили заявку .itmsp. Інакше, можливо, доведеться видалити .itmspвсі списки, а потім вбити всю базу даних асоціацій шукачів, використовуючи lsregister -kill -seed. Ніколи цього не робив, не розповідаючи, скільки шкоди буде завдано решті вашої системи. Ймовірно, ви хочете скасувати реєстрацію, потім відредагувати списки, а потім вбити та перезавантажити базу даних. Не здивуйте мене, якщо реєстратор не видалить асоціацію, якщо ви її вже видалили із списку, а повторне повторне додавання додасть її назад, якщо ви її ще не видалили. Плюс до цього ви не втратите всіх інших асоціацій щодо програм, які ображають.

Що ще гірше, Xcode міг пройти і встановити біт пакета для всіх папок. Я думаю, тоді вам доведеться написати сценарій за допомогою GetFileInfoта SetFileсканувати диск та скасувати їх, що є болем, але можливо. Пальці, схрещені шматочки пучка, залишаються невстановленими. Використовуйте GetFileInfoдля перевірки, перевіривши декілька.


0

Я вважаю, що ви можете виправити це за допомогою

/usr/bin/SetFile -a B /path/to/file.itmsp

Перевірте це на одному, перш ніж спробувати його на всіх інших, очевидно.

Якщо вам потрібно, щоб усі вони працювали у заданій папці:

find . -name \*.itmsp -exec /usr/bin/SetFile -a B {} \;

повинен зробити це за вас.


1
SetFile -a B встановлює біт розшарування. Насправді, він повинен бути відключений: SetFile -a b. Але це не матиме ефекту, оскільки Has bundleбіт не встановлений: GetFileInfo -ab foo.itmspповертається 0.
jaume
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.