【问题标题】:Mac app default working directoryMac 应用默认工作目录
【发布时间】:2010-12-26 04:01:59
【问题描述】:

我之前在 Xcode 中制作了许多应用程序,并且它们的默认工作目录始终是 .app 文件所在的目录,因此我访问了内部数据,例如 What.app/Contents/Resources。我知道这可能不是正确的方法,但它一直有效。无论如何,无论是由于最近的 Xcode 更新还是出于其他原因,它们的默认工作文件夹现在都设置为“/”。这只发生在我从 Finder 运行 .app 文件时。如果我从 Xcode 中运行它,则文件夹路径是正确的(我可以在可执行选项中设置该路径,但它对直接运行 .app 时发生的情况没有影响)。这是某个地方的设置还是只是新标准?

【问题讨论】:

  • 这不是什么新鲜事——在 NeXT 已经有 15 年多了
  • 永远不要对初始工作目录做出任何假设 - 您的应用会以许多不同且有趣的方式中断。

标签: cocoa xcode macos


【解决方案1】:

对于资源,使用这个很酷的代码:

NSString *path = [[NSBundle mainBundle] pathForResource:@"awesomepic" ofType:@"png"];

你不应该依赖 PWD 和 Cocoa。相反,尽可能使用 Cocoa API。只有在 Apple 未提供其他方式时才应使用 BSD API。


globheader.h

static char *appdir;

appcontroller.m

#import "globheader.h"

@implementation AppController

- (void)method {
  appdir = [[[NSBundle mainBundle] bundlePath] UTF8String];
}

@end

cppcode.cpp

#include "globheader.h"

int main() {
  printf("%s", appdir);
  return 0;
}

【讨论】:

  • 好吧,我的代码块是用 C++ 编写的,并且只使用 Cocoa 进行窗口化。是否有一个方便的 Cocoa 函数来设置资源文件夹的工作路径或类似的东西?
  • 把你的文件扩展名从.cpp改成.mm,导入Cocoa头文件,就可以同时使用Objective-C和C++了。
  • 大部分加载文件的代码必须跨平台。我在 OS-wrappers 中有特定于 OS 的函数,但是很多代码都使用默认工作目录作为起点。有没有办法从 Cocoa 中设置它?或者至少将我的 .app 文件的位置作为字符串获取?
  • 你可以创建一个带有静态变量的全局头文件并从你的Objective-C中导入,设置它,你可以从C++中获取它。请注意,您必须使用 C 字符串文字而不是 NSString。请参阅 -[NSString UTF8String]`。
  • 您可以像在 C++ 中一样在 Objective-C 中设置工作目录,只要您 #include <unistd.h>
【解决方案2】:

toastie,为什么要使用应用程序包来存储数据?不要更改您的 .app。

Instread,使用应用程序支持文件夹。您可以毫无问题地修改该文件夹中的字节。阅读以下来自 Matt Gallagher 的帖子,

http://cocoawithlove.com/2010/05/finding-or-creating-application-support.html

问候,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    相关资源
    最近更新 更多