如何将工作目录更改为程序所在位置

5

我希望使用C++在Mac OS上打开一个文件。

如果我在Xcode下运行程序,工作目录与程序相同,这很好。但是,如果我尝试在终端中运行程序,工作目录始终为“Users/username”。您知道如何将工作目录更改为程序所在的位置吗?

以下是示例代码:

#include <iostream>
#include <fstream>
using namespace std;
int main (int argc, const char * argv[])
{
    char * dir = getcwd(NULL, 0); 
    cout << "Current dir: " << dir << endl;

    ifstream fin("hi.txt");
    if (fin.is_open()) cout << "File is Open" << endl;
    else cout << "File is not open" << endl;    
    fin.close();
    return 0;
}

为什么要让程序使用其自己的安装目录作为当前目录?如果软件已经正确安装,它可能无法在那里写入。它可能能更方便地读取文件,但这是有争议的优点。另一方面,如果我从“$HOME/src/subdir/myprogram”启动程序,我希望指定相对于启动目录而不是相对于“/Applications/Doohickey.app/Contents/MacOS”或“$HOME”之类的目录的文件名。当然,这取决于程序的功能...但在使用chdir()时要小心。 - Jonathan Leffler
我只想把所有文件放在一起。我以前经常使用Windows。当我在Windows下运行命令行程序时,该程序生成的文件应该在程序的同一位置。我明白你的意思。我会考虑的。非常感谢。 - Yuchen
请记住,Windows 主要不是一个多用户系统,并且没有类似 Unix 的每个用户的主目录。这导致程序分散数据到各个地方。在类 Unix 系统中,建议将数据存储在 $HOME 的某个位置。例如,配置信息可能在文件(或目录)$HOME/.yourapp 中。请查看苹果公司的“OS X 人机界面指南”,了解在 Mac OS X 上定位东西的位置。 - Jonathan Leffler
我在这里遇到了类似的问题,但无法根据此解决方案进行修复。我急需解决方案,并将通过声望来补偿。https://dev59.com/fp3ha4cB1Zd3GeqPNgEs - JosephTLyons
同时,我也向能够帮助我解决问题的人提供赏金。 - JosephTLyons
4个回答

11

在您的调试设置方案中的工作目录中使用值$(PROJECT_DIR)

输入图像描述


对于 Xcode 5:Product -> Scheme -> Edit Scheme -> Run "appname" -> Options,然后您会找到 "Working Directory" 选项。 - Daniel
我这里也遇到了类似的问题,但根据这个解决方案无法解决。我非常需要一个解决方案,并愿意用一些声望作为补偿。 https://dev59.com/fp3ha4cB1Zd3GeqPNgEs - JosephTLyons
我还打算向能够帮助我修复它的人提供赏金。 - JosephTLyons

3
您可以在Xcode中为项目设置自定义工作目录。在Xcode 4中,从项目窗口工具栏的方案菜单中选择“编辑方案”以打开方案编辑器。从项目编辑器的左侧选择“运行”步骤。单击方案编辑器顶部的“选项”按钮。选择“使用自定义工作目录”复选框。单击文本字段右侧的按钮以选择工作目录。enter image description here

2

这是一篇非常旧的文章 - 更新了Xcode 12的一些信息(2020年9月)

步骤1)。 Xcode -> 产品 -> 方案 -> 编辑方案(或创建新方案)

在哪里找到EditScheme的屏幕截图

步骤2)运行(调试),工作目录(勾选)并输入$(PROJECT_DIR)作为起点。

在方案中更改/编辑的项目


我整年都在寻找那个。 - Neil

1

但是你知道如何获取正在运行的应用程序的路径吗? - Yuchen
argv[0] 始终包含路径(以及程序名称,当然)。 - llakais
依赖于 argv[0] 可能不是一个好主意,因为没有标准规定它必须始终包含完整路径,有时只会包含启动命令的第一部分。解决方案是使用 GetModuleFileName(...)readlink( "/proc/self/exe", ...) - Youda008

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接