3

Mac OS X Finder 使用“包”的概念使某些文件夹的内容对用户不透明。我os.walk()用来枚举目录树,我想跳过对应用程序包等包的枚举。

命令行mdls实用程序可用于检查是否com.apple.packagekMDItemContentTypeTree属性中。在检测到操作系统确实是 darwin 之后,检测文件夹是否是要放入os.system和使用的包的唯一/最佳方法是什么?mdls

顺便说一句,这个解决方案似乎依赖于 Spotlight 元数据,我理解它是文件/目录本身填充的。这让我想知道是否有一种方法可以检查目录是否是mdls. 也许我错过了一些东西。

4

1 回答 1

2

OS X 包(和捆绑包)通常由它们的扩展名定义。只需创建一个带有.app扩展名的目录,即可在 Finder 中将其显示为(损坏的)应用程序。

官方文档列出了以下定义捆绑包的方法:

如果满足以下任一条件,则 Finder 将目录视为一个包:

  • 该目录具有已知的文件扩展名:.app、.bundle、.framework、.plugin、.kext 等。
  • 该目录有一个扩展名,其他一些应用程序声称它代表一个包类型;请参阅“文档包”。</li>
  • 该目录设置了其包位。

指定包的首选方法是为包目录指定一个已知的文件扩展名。在大多数情况下,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
于 2013-07-23T20:46:43.823 回答