Mac OS X Finder 使用“包”的概念使某些文件夹的内容对用户不透明。我在用着os.walk()
枚举目录树,并且我想跳过对应用程序包等包的枚举。
The mdls
命令行实用程序可用于检查是否com.apple.package
在里面kMDItemContentTypeTree
属性。是检测文件夹是否是要放入的包的唯一/最佳方法os.system
并使用mdls
在检测到操作系统确实是darwin之后?
顺便说一句,这个解决方案似乎依赖于我理解的 Spotlight 元数据from文件/目录本身。这让我想知道是否有一种方法可以检查目录是否是外部的包mdls
。也许我错过了一些东西。
OS X 软件包(和捆绑包) http://developer.apple.com/library/mac/#documentation/CoreFoundation/Conceptual/CFBundles/Introduction/Introduction.html/通常由它们的扩展名来定义。只需创建一个目录.app
扩展以查看它在 Finder 中显示为(损坏的)应用程序。
The 官方文档 http://developer.apple.com/library/mac/#documentation/CoreFoundation/Conceptual/CFBundles/AboutBundles/AboutBundles.html列出了以下定义捆绑包的方法:
如果满足以下任一条件,则 Finder 会将目录视为包:
- 该目录具有已知的文件扩展名:.app、.bundle、.framework、.plugin、.kext 等。
- 该目录具有一些其他应用程序声称代表包类型的扩展名;请参阅“文件包”。
- 该目录已设置其包位。
指定包的首选方法是为包目录提供已知的文件扩展名。在大多数情况下,Xcode 通过提供应用正确扩展名的模板来为您处理此问题。您所要做的就是创建一个适当类型的 Xcode 项目。
检测包的最简单方法是检测这些扩展。快速而肮脏的方法是简单地使用上述文档作为指南来查找硬编码的扩展列表。
下一步是查询操作系统是否给定的扩展已注册为文档包。看如何检查 Finder 是否将具有给定扩展名的目录显示为包? https://stackoverflow.com/questions/16933733/how-to-check-whether-directories-with-a-given-extension-are-shown-by-the-finder
要检测目录上的包位,您必须使用xattr library https://pypi.python.org/pypi/xattr检索u'com.apple.FinderInfo'
键,然后使用Finder.h标头信息 http://opensource.apple.com/source/CarbonHeaders/CarbonHeaders-8A428/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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)