3

Mac OS X Finder は、「パッケージ」の概念を使用して、特定のフォルダの内容をユーザーに対して不透明にします。を使用os.walk()してディレクトリ ツリーを列挙していますが、アプリケーション バンドルなどのパッケージの列挙をスキップしたいと考えています。

mdlsコマンドライン ユーティリティを使用して、 が属性に含まれているかどうかを確認できcom.apple.packageますkMDItemContentTypeTree。OSが実際にdarwinであることを検出した後に、フォルダーがドロップしos.systemて使用するパッケージであるかどうかを検出する唯一/最良の方法はありますか?mdls

余談ですが、このソリューションは、ファイル/ディレクトリ自体から入力されていると私が理解している Spotlight メタデータに依存しているようです。これは、ディレクトリが の外部のパッケージであるかどうかを確認する方法があるかどうか疑問に思いますmdls。おそらく私は何かを見逃しています。

4

1 に答える 1

2

OS X パッケージ (およびバンドル)は通常、拡張子によって定義されます。拡張子を付けてディレクトリを作成するだけ.appで、Finder で (壊れた) アプリケーションとして表示されます。

公式ドキュメントには、バンドルを定義する次の方法がリストされています。

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

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

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

パッケージを検出する最も簡単な方法は、それらの拡張子を検出することです。手っ取り早い方法は、上記のドキュメントをガイドとして使用して、ハードコードされた拡張機能のリストを探すことです。

次のステップは、特定の拡張機能がドキュメント パッケージとして登録されているかどうかを OS に問い合わせることです。特定の拡張子を持つディレクトリが Finder によってパッケージとして表示されるかどうかを確認する方法を参照してください。

ディレクトリのパッケージ ビットを検出するには、xattrライブラリu'com.apple.FinderInfo'を使用してキーを取得し、Finder.hヘッダー情報を使用して返されたバイナリ データをデコードする必要があります。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
于 2013-07-23T20:46:43.823 に答える