以编程方式确定 OSX 上的文件内容类型

Posted

技术标签:

【中文标题】以编程方式确定 OSX 上的文件内容类型【英文标题】:Programmatically determine file content type on OSX 【发布时间】:2012-06-08 15:15:08 【问题描述】:

我正在处理内容格式在 OSX 的多个版本中发生变化的文件,以前是 ASCII,然后是 JSON,现在是二进制 plist。所以我需要确定它是什么类型的文件,以便我可以将其解析为文本、使用 JSON API 或将 plist 加载为字典/数组。

我可以使用 /usr/bin/file 命令告诉我文件内容类型,但我更喜欢以编程方式执行此操作。有这方面的 Cocoa API 吗?

我查看了 NSFileManager attributesOfItemAtPath:error: 但这只是返回 NSFileTypeRegular,这没有帮助。

【问题讨论】:

【参考方案1】:

没有匹配文件的 Cocoa API。有多种不同的 Cocoa(和 CF)API 来处理“文件类型”,但它们混合使用了扩展和经典的 Mac Finder 信息,这不是您想要的。

正如 H2CO3 所暗示的那样,您想要的是 libmagic。但是你想要 BSD 版本。它是 Fine Free File Command 源代码的一部分,与 OS X 的内置文件命令来源相同,它是 BSD 许可的,并且更新更频繁。

您可以通过 http://www.darwinsys.com/file/ 获得它,但也可以从 Homebrew 或 MacPorts 获得。

【讨论】:

谢谢你,这看起来比源伪造链接更有希望。我希望避免依赖,但这应该就足够了。谢谢。【参考方案2】:

这可能会对您有所帮助:http://sourceforge.net/projects/libmagic/ 这是 Linux 上 Libmagic 的手册页;因为这不是一个完全依赖于操作系统的库,所以这很可能在不修改 Mac 的情况下也可以工作。见http://linux.die.net/man/3/libmagic

【讨论】:

不幸的是,该项目自 2000 年以来似乎已被废弃且未受影响。GPL 许可也让我犹豫不决,因为我有一天可能会成为产品的一部分。我希望 Cocoa 方法可以使用与“文件”命令相同的代码。 @brianpartridge:从“2009 年 7 月 17 日最后一次更新”的页面上,您从哪里得到“自 2000 年以来被遗弃和未受影响”的信息? @H2CO3:虽然您可以获得使用您刚刚提供的库的文件命令,但这不是 OS X 随附的命令——或我所知道的任何其他 *nix,包括 linux 发行版. @abarneert 我没有看到任何关于 2009 年的信息,但是哦,您发布的新链接看起来很有希望。

以上是关于以编程方式确定 OSX 上的文件内容类型的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Drupal 7 中以编程方式创建新的内容类型?

在 Darwin/OSX 中以编程方式确定进程信息

如何以编程方式设置内容类型?获取 org.jvnet.mimepull.MIMEParsingException:缺少开始边界

C# - 以编程方式识别 2 个表之间的关系类型

SharePoint:如何以编程方式将项目添加到自定义列表实例

在Darwin / OSX中以编程方式确定流程信息