ファイルタイプの関連付けを元に戻す


12

iTunes Music Storeパッケージをときどき使用しています。これらのパッケージには.itmsp拡張子があります。のように.app.itmsp本質的にはコンテナディレクトリです。.itmspフォルダーにはXMLファイルとメディアファイルが含まれます。

最新のXcodeおよび/またはMac OS Xアップデート(Mac OS 10.8.3のXcode 4.6.1)は、.itmsp拡張子を持つディレクトリのファイルタイプの関連付けをハイジャックしました。以前は、通常のフォルダのように扱われていました。内部を見るためにダブルクリックする必要はありませんでした。次に、それらを操作するにはダブルクリックする必要があります。実行すると、Application Loaderというプログラムがそれらを開こうとします。内部を見るには、右クリックして「パッケージの内容を表示」を選択する必要があります。私はいつでもこれらのファイルを何千も扱っているので、うまくいきません。

Get InfoとRCDefaultAppを使用して、ファイルタイプの関連付けを変更または削除しようとしました。どちらも動作しません。ファイルタイプの関連付けを削除すると、.itmspディレクトリが空のファイルになります。Application Loader.appを完全に削除します。どちらの場合でも、右クリックせずにコンテンツを閲覧することはできません。

以前に受け入れられた答えは、しばらくの間、御馳走を働いた:lsregister -u /Applications/Contents/Applications/Application\ Loader.app/私はあなたがXcodeのをインストールしている場合は、ディレクトリに名前を付けることで、この自分自身をテストすることができるはずXcodeと/またはMac OS Xを更新してからそれは動作を停止していますfoo.itmsp

.itmspファイルをもう一度フォルダとして扱うようにするにはどうすればよいですか?


Xcodeアプリアイコンにファイルをドラッグアンドドロップして、目的の動作を確認したことがありますか?
MrDaniel

提案をありがとう。目前の問題とは関係ないため、質問を編集して意図を明確にします。
マイケルマイケル

1
OS Xのどのバージョンを実行していますか?Xcodeのバージョン
古いプロ

CFBundleDocumentTypesからタイプを削除し、Launch Service DataBaseで強制終了したアンサーを削除しました。しばらくは機能しますが、後のある時点で再び自己を主張するように見えます。
マークハンテ

回答:


11

問題:.itmspフォルダーがファイルとして表示される

Finderは.itmspフォルダーをパッケージとして、つまり単一のファイルのように扱います。たとえば、列ビューでは、.itmspフォルダー内に含まれるものはすべて表示されず、ドキュメントアイコンのみが表示されます。

ここに画像の説明を入力してください

次の条件のいずれかが当てはまる場合、Finderはディレクトリをパッケージと見なします(バンドルプログラミングガイドから)。

  1. ディレクトリには、.app、.bundle、.framework、.plugin、.kextなどの既知のファイル名拡張子があります(定義されて/System/Library/CoreServices/CoreTypes.bundle/Contents/Info.plistいるとおりです。これはバイナリ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が変更されたタイプ宣言を使用するように強制することです。

重要な注意点:

OPの問題は確実に解決されますが、提案されたソリューションは、他のパッケージに適用された場合、フォルダーとして表示されません。

提案されたソリューションは、非標準のアプリケーションパスにあるアプリケーションによって宣言されたファイルタイプでのみ機能するようだとわかりました。

これは、の場合であるApplication Loader.appに位置し、/Applications/Xcode.app/Contents/Applications/

部分的な解決策に関心がある場合は、この回答の終わりを確認してください。

Finderで.itmspフォルダーをフォルダーとして表示するには、次の手順に従います。

  1. [アプリケーション]フォルダーでAutomatorを開き、[ アプリケーション ]を選択します

    ここに画像の説明を入力してください

  2. [ライブラリ]リストで[ユーティリティ]を選択し、[シェルスクリプトの実行]を選択して、右側のペインにドラッグします。

    ここに画像の説明を入力してください

  3. デフォルトのスクリプトの内容をexit 0次のように置き換えます。

    ここに画像の説明を入力してください

  4. アプリケーションをitmspOpenerとして保存します。

    ここに画像の説明を入力してください

  5. Automatorを閉じます。

  6. itmspOpener.appその内容を選択して表示します。

    ここに画像の説明を入力してください

  7. Contents> 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>
    

    注: なぜin kUTTypeDirectoryではなく?Appleのドキュメントから:重要:コードでシステム定義のUTIを使用する場合、実際のUTI文字列ではなく、Launch Servicesフレームワークで定義されている定数を使用する必要があります。たとえば、「com.apple.application」ではなくkUTTypeApplicationを渡します。「システム宣言のUniform Type Identifiers」は、UTI文字列に加えてこれらの定数をリストしています。public.directoryUTExportedTypeDeclarationsUTCoreTypes.h

  9. .itmspファイルを関連付けてitmspOpener、ボタンを押しますChange All...

    ここに画像の説明を入力してください

  10. Launch Servicesデータベースをリセットします。

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

    (OS 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このコンテンツで作成します(変数itmspOpeneritmspOpener.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:S '

    $ 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アプリケーションLoader.appのタイプの輸出でフラグが設定されて?Application Loaderを破りました。

酸のテスト:.itmspフォルダーは、iTunesの更新後もそのまま表示されます

私は最近Xcodeを更新しました:

ここに画像の説明を入力してください

更新中に.itmspフォルダーがフォルダーとして表示されたことを確認できます。

ここに画像の説明を入力してください

そしてその後:

ここに画像の説明を入力してください

部分的な解決策:ダブルクリックするとパッケージに内容が表示されます

前述のとおり、上記の手順は、Finderによってパッケージとして表示される任意のフォルダーでは機能しません。

ただし、パッケージをダブルクリックして開くだけの場合は、1つのbashスクリプトとAutomatorでそれを行う方法があります。

  • このスクリプトは、パッケージ内に非表示の一時フォルダーを作成し、Finderに表示し(したがって、パッケージをフォルダーとして表示し)、一時フォルダーを削除します。

    注意:

    スクリプトは、代わりに非表示の一時ファイルを作成できます。ただし、空のフォルダーrmdirのみを削除しファイルを削除するため、何らかの理由でフォルダーを作成することをお勧めます。スクリプトは大混乱を引き起こし、空のフォルダのみが削除されます。これはおそらくファイルが削除された場合ほど悪くはありません。rm

  • Automatorは、パッケージファイルに関連付けられるアプリケーションにスクリプトをバンドルします。

これらは、このようなアプリケーションを作成する手順です。以下の説明では、パッケージタイプの例として.itmspファイルを使用します。

  1. [アプリケーション]フォルダーでAutomatorを開き、[ アプリケーション ]を選択します

    ここに画像の説明を入力してください

  2. [ ライブラリ]リストで[ ユーティリティ]を選択し、[ シェルスクリプトの実行]を選択して、右側のペインにドラッグします。

    ここに画像の説明を入力してください

  3. 引数として入力渡すを設定します

    ここに画像の説明を入力してください

  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. Automatorを閉じます。

これで、.itmspファイルが関連付けられている場合、フォルダーとして開くことができるアプリケーションができました。

表面的な問題があります:現状では、関連するファイルには標準の白いドキュメントアイコンがあります:

ここに画像の説明を入力してください

これも修正しましょう:

  1. Automatorが閉じていることを確認してください。

  2. itmspOpenerを選択して、その内容を表示します。

    ここに画像の説明を入力してください

  3. Contents> 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.icnsitmspOpener/Contents/Resources

    ここに画像の説明を入力してください

  8. .itmspファイルを関連付けてitmspOpener、ボタンを押しますChange All...

    ここに画像の説明を入力してください

.itmspファイルのアイコンはフォルダーに変更する必要がありますが、少なくともそうは思いました。残念ながら、そうではありませんでした。そこで、アプリケーションitmspOpenerを別の場所に移動しました(デスクトップに一時フォルダーを作成し、そこに移動してデスクトップに戻しました)。これにより、Finderのアイコン情報が更新されました。

ここに画像の説明を入力してください

.itmspファイルをダブルクリックして、フォルダーとして開いているのを確認します。

ここに画像の説明を入力してください


これは非常に印象的です...しかし、1つの厄介な問題があるようです:Finderが列ビュー(私の好みのビュータイプ)にある場合、.itmspフォルダー内に含まれるものはすべて見えません。理由を整理することはできませんが、あります。さらに、もし私が自分の娘を持っているなら、中身を見るためにファイルをダブルクリックする必要はないでしょうが、まあまあです。
マイケルマイケル

1
あなたが正しいです。コラムビューを使用することは想定していませんでしたが、数千個の.itmspフォルダーを処理する場合に完全に理にかなっていると言わなければなりません。しかし、問題を解決する方法を見つけました。つまり、Finderが.itmspフォルダーをフォルダーとして扱うように強制します。私の編集を見てください(または溶液と呼ばれる最後の段落に直接ジャンプが、段落にトリックを説明したように、第1 itmspOpenerのInfo.plistを変更することを忘れないでください。)
ジャウメ

信じられない!答えてくれてありがとう。これは、FinderとOS Xを動かすいくつかのことの非常に興味深い外観です。
マイケルマイケル

おかげで、私はあなたがそれを有用であることがわかってうれしいです!(後で答えを編集して読みやすくし、より多くの構造を与えます。)
jaume

私はついに答えを編集する時間を見つけました。段落を並べ替えて、回答で説明した解決策がiTunesの更新の影響を受けないという証拠を追加しました。
ジャウメ

7

1つのオプションはlsregister -u /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/、Application Loaderをで登録解除することですが、開かれた場合、Launch Servicesデータベースが再構築された場合、または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/lsregister10.5以降です。


変更後にアプリの登録を解除するとInfo.plist、plistから削除したファイルの種類が登録解除されますか?私はそれが機能することを想像できますし、失敗することは簡単に想像できます。も。
古いプロ

@OldProええ、lsregister -u $app && lsregister $app少なくともこの場合、Info.plistに変更を適用するようです。
リ、

これは素晴らしい答えです-次回Xcodeをアップグレードするときは、デフォルトを登録するApplication LoaderがCFBundleDocumentTypes必要になる可能性があることに留意してください。またはそれを変更するタイヤ。
bmike

2

これは、バンドルに関するAppleの文書からの関連する抜粋です(強調を追加

システムがバンドルとパッケージを識別する方法

次のいずれかの条件に該当する場合、Finderはディレクトリをパッケージと見なします。

  • ディレクトリには、.app、.bundle、.framework、.plugin、.kextなどの既知のファイル名拡張子があります。
  • ディレクトリには、他のアプリケーションがパッケージタイプを表すと主張する拡張子があります。「ドキュメントパッケージ」を参照してください。
  • ディレクトリにはパッケージビットが設定されています。

パッケージを指定する望ましい方法は、パッケージディレクトリに既知のファイル名拡張子を付けることです。ほとんどの場合、Xcodeは正しい拡張子を適用するテンプレートを提供することでこれを処理します。必要なのは、適切なタイプのXcodeプロジェクトを作成することだけです。

ほぼ確実に、Xcodeは.itmspドキュメントパッケージで説明されているように、パッケージタイプを表すと主張していることを表しています。そのため、Xcodeからその拡張機能を削除するInfo.plistとうまくいくかもしれませんが、その関連付けがFinderによって認識されると、Xcodeから削除しても元に戻らないと思われます。「アプリケーションから開く...」を右クリックしたときに表示される「推奨アプリケーション」は何ですか?Info.plistsをすべて確認する必要があります。

lsregister -u申し立てを行っ.itmspたアプリの登録解除に使用できるかどうかを確認することをお勧めします。それ以外の場合は.itmsp、すべてのリストから削除してから、を使用してファインダー関連データベース全体を削除する必要がありますlsregister -kill -seed。それをやったことはなく、システムの残りの部分にどれほどの損害を与えるかはわかりません。おそらく、登録を解除し、plistsを編集してから、データベースを削除して再シードする必要があります。既にplistから削除している場合、登録解除で関連付けが削除されなくても、驚かないでください。まだ削除していない場合、reseedは再び追加します。さらに、この方法により、問題のあるアプリの他の関連付けがすべて失われることはありません。

さらに悪いことに、Xcodeはすべてのフォルダーにバンドルビットを設定して設定できたはずです。その場合、ディスクを使用GetFileInfoSetFileてを使用してスクリプトを記述し、ディスクをスキャンして元に戻す必要があります。バンドルビットを越えた指は未設定のままです。GetFileInfoいくつかをテストして確認するために使用します。


0

私はあなたがこれを修正できると信じています

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

明らかに、他のすべてで試す前に、1つでテストしてください。

指定されたフォルダ内のすべてで実行する必要がある場合:

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

あなたのためにそれを行う必要があります。


1
SetFile -a B バンドルビットを設定します。実際、無効にする必要がありますSetFile -a b。ただし、Has bundleビットが設定されていないため、これは効果がありません:をGetFileInfo -ab foo.itmsp返します0
ジャウメ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.