【问题标题】:How to access a command line application's bundle in C如何在 C 中访问命令行应用程序的包
【发布时间】:2010-03-25 16:26:44
【问题描述】:

我在 Mac 上,使用 Xcode 进行编程。我有一个命令行应用程序,它将读取/写入它的包中的文件,我想知道如何访问这些文件。

谢谢, 文先生

编辑:如果我只是在用户的库文件夹中创建一个文件夹会更好吗?

【问题讨论】:

  • 命令行工具通常不是捆绑包——你能告诉我们更多关于应用程序结构的信息吗?
  • 请注意,您可能不想写入到您的捆绑包中的文件,因为在很多情况下您会遇到权限问题。不过阅读应该没问题。

标签: c xcode macos command-line


【解决方案1】:

假设您实际上有一个捆绑包,您可以使用 CoreFoundation CFBundle API。您可以使用CFBundleGetMainBundle() 来查找您应用的捆绑包,并使用CFBundleCopy*URL() 函数来获取捆绑包及其各个组件的URL。

但是,应用程序不应写入其捆绑包。有很多事情可能会出错,例如当前用户没有写权限或签名包被破坏。通常,您的应用程序应该将它创建的文件放在 ~/Library/Application Support 文件夹中,这些文件不是用户可编辑的*。用户文档的正常存放位置是 Documents 文件夹。

(* 为了澄清“用户可编辑”,我的意思是用户通常希望导航到并打开自己的文件,而不是简单地成为只能通过应用程序界面访问的数据的私有存储。因此,例如 TextEdit 文档去在文档中,而便笺则在应用程序支持中。)

【讨论】:

  • 好的,那么我应该如何处理应该是用户可编辑的文件?
  • 但是不要让您的应用程序自动将文件转储到 ~/Documents —— 将用户的 Documents 文件夹弄乱有点粗鲁。
  • @mipadi:可以在用户的​​文档文件夹中创建一个文件夹并从那里工作吗?
  • 最好用户应该能够选择文档的去向。
  • @Mr.Man:如果你的应用自动创建文件,它们应该放在~/Library/Application Support下;否则,让用户选择放置它们的位置。
【解决方案2】:

不确定我是否理解你的问题, 但如果你想要你的资源之一的路径,你可以使用:

NSString *path = (NSString*)[[NSBundle mainBundle] pathForResource:@"sample" ofType:@"png"];

如果您只想要应用程序目录,您可以使用:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [[paths objectAtIndex:0] retain];

NSArray *resPaths = NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSUserDomainMask, YES);
NSString *resourceDirectory = [[resPaths objectAtIndex:0] retain];

我现在不在我的 Mac 上,所以我只是从我们的框架中粘贴。

【讨论】:

  • 注意:我们实际上将命令行工具构建为普通的应用程序包。
  • 好的,我在 Objective-C 中使用过这些,但我的程序是用 C 编写的,您的第二个和第三个可以使用常规 C 数组吗?
  • @Carl 通常只包含包内的完整路径(“.../osx.app/Contents/MacOS/main”)。
猜你喜欢
  • 2021-06-28
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
相关资源
最近更新 更多