gpt4 book ai didi

python - 使用 Python 识别 Mac OS X 中的包目录

转载 作者:行者123 更新时间:2023-11-28 17:46:08 27 4
gpt4 key购买 nike

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

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

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

最佳答案

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

official documentation列出了以下定义束的方法:

The Finder considers a directory to be a package if any of the following conditions are true:

  • The directory has a known filename extension: .app, .bundle, .framework, .plugin, .kext, and so on.
  • The directory has an extension that some other application claims represents a package type; see “Document Packages.”
  • The directory has its package bit set.

The preferred way to specify a package is to give the package directory a known filename extension. For the most part, Xcode takes care of this for you by providing templates that apply the correct extension. All you have to do is create an Xcode project of the appropriate type.

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

下一步是查询操作系统是否给定扩展名已注册为文档包。参见 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

关于python - 使用 Python 识别 Mac OS X 中的包目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17820117/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com