簡體   English   中英

使用 Python 識別 Mac OS X 中的包目錄

[英]Identify directories that are packages in Mac OS X with Python

Mac OS X Finder 使用“包”的概念來使某些文件夾的內容對用戶不透明。 我正在使用os.walk()來枚舉目錄樹,我想跳過對應用程序包等包的枚舉。

mdls命令行實用程序可用於檢查com.apple.package是否在kMDItemContentTypeTree屬性中。 在檢測到操作系統確實是達爾文之后,檢測文件夾是否是放入os.system並使用mdls的包的唯一/最佳方法是什么?

順便說一句,這個解決方案似乎依賴於 Spotlight 元數據,我理解它是文件/目錄本身填充的。 這讓我想知道是否有一種方法可以檢查目錄是否是mdls之外的mdls 也許我錯過了一些東西。

OS X 包(和包)通常由它們的擴展名定義。 只需創建一個帶有.app擴展名的目錄,即可看到它在 Finder 中顯示為(損壞的)應用程序。

官方文檔列出了以下幾種定義bundle的方式:

如果滿足以下任一條件,則 Finder 會將目錄視為包:

  • 該目錄具有已知的文件擴展名:.app、.bundle、.framework、.plugin、.kext 等。
  • 該目錄有一個擴展名,其他一些應用程序聲稱該擴展名代表了一種包類型; 請參閱“文檔包”。
  • 該目錄設置了它的包位。

指定包的首選方法是為包目錄指定一個已知的文件擴展名。 在大多數情況下,Xcode 會通過提供應用正確擴展名的模板來為您處理這個問題。 您所要做的就是創建一個適當類型的 Xcode 項目。

檢測包的最簡單方法是檢測這些擴展。 快速而骯臟的方法是簡單地查找硬編碼的擴展列表,使用上述文檔作為您的指南。

下一步是查詢操作系統是否已將給定擴展注冊為文檔包。 請參閱如何檢查 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM