[英]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.