【问题标题】:Identify directories that are packages in Mac OS X with Python使用 Python 识别 Mac OS X 中的包目录
【发布时间】:2013-07-23 02:36:45
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您决定使用mdls,请使用subprocess module 而不是os.system 调用它。
  • 谢谢你,@nofinator

标签: python macos metadata spotlight


【解决方案1】:

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

official documentation 列出了以下定义捆绑包的方法:

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

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

指定包的首选方法是为包目录指定一个已知的文件扩展名。在大多数情况下,Xcode 会通过提供应用正确扩展的模板来为您解决这个问题。您所要做的就是创建一个适当类型的 Xcode 项目。

检测包的最简单方法是检测这些扩展。快速而肮脏的方法是使用上述文档作为指南,简单地查找硬编码的扩展列表。

下一步是查询操作系统是否已将给定扩展注册为文档包。见How to check whether directories with a given extension are shown by the Finder as a package?

要检测目录上的包位,您必须使用xattr library 检索u'com.apple.FinderInfo' 键,然后使用Finder.h header info 解码返回的二进制数据; 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

【讨论】:

  • 问题的症结(以及有效实施的方法)需要能够一次查询系统以获取应视为文档的所有扩展名的列表包,即使在您提供给另一个问题的链接中,似乎也没有一种简单的方法可以做到这一点,除非我遗漏了一些东西。该链接概述了一种针对系统测试单个扩展的方法,这有点像在黑暗中射击。尽管如此,您的 xattr 代码和 kHasBundle 位帮助了我很多。
  • 我已经重新阅读了您提供的链接,但在 Objective-C 中似乎没有一种优雅的方法可以做到这一点,更不用说 Python!
  • 不,我也找不到更好的方法。看起来mdls 工具更简单。
猜你喜欢
  • 2011-10-09
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 2011-12-16
  • 2012-03-05
相关资源
最近更新 更多