OSX上应用程序的首选路径?

时间:2020-03-06 14:53:13  来源:igfitidea点击:

我希望能够从我的应用程序中运行文本编辑器,如用户在TEXT_EDITOR环境变量中给出的那样。现在,假设该变量中没有任何内容,我想默认使用OSX附带的TextEdit程序。是否将/Applications/TextEdit.app/Contents/MacOS/TextEdit硬编码到我的应用程序中,还是有更好的调用程序的方法?

编辑:出于记录,我仅限于在C中运行特定的应用程序路径。我没有打开文本文件的路径。

编辑2:说真的,人们,我不在这里打开文件。我在问一个应用程序路径是有原因的。

解决方案

我相信Mac OS X提供了默认的应用程序机制,因此.txt将在TextEdit.app或者Emacs或者GVim或者用户指定的任何内容中打开。我在网上找不到任何东西。

我们可以从应用程序中运行以下命令:

open <full path to text file>

这将在默认的文本编辑器中打开文本文件。我们可以使用" open"命令打开任何文件类型。

我相信,如果用户的语言设置不是英语,则对"应用程序"进行硬编码将无法正常工作。例如,在Norsk中,"应用程序"文件夹被命名为"程序员"。

有关国际化的苹果文件在这里。从第45页开始是有关处理本地化路径名的部分。

Mac OS X具有一种称为"统一类型标识符"的机制,该机制用于跟踪数据类型与可以处理它们的应用程序之间的关联。管理此任务的子系统是Launch Services。我们可以执行以下两项操作之一:

  • 如果文件具有相当知名的路径扩展名,例如.txt文件,我们可以要求NSWorkspace在相应的应用程序中打开文件。
  • 如果我们没有众所周知的路径扩展名,但是知道数据的类型,则可以要求Launch Services查找该类型的默认应用程序,然后让NSWorkspace在该特定应用程序中打开文件。 。

如果以这种方式执行此操作,则将获得与Finder相同的行为,并且不必只需要fork()/ exec()或者使用system()即可打开文件。

在第二次编辑中,这听起来像我们只是想要获取TextEdit的路径,这可以通过使用NSWorkspace方法absolutePathForAppBundleWithIdentifier轻松完成:

NSString *path = [[NSWorkspace sharedWorkspace] absolutePathForAppBundleWithIdentifier:@"com.apple.TextEdit"];