【问题标题】:how to change the working directory to the location of the program如何将工作目录更改为程序所在的位置
【发布时间】:2012-10-24 21:34:18
【问题描述】:

我想使用 c++ 在 Mac OS 上打开文件。

如果我在Xcode下运行程序,工作目录和程序一样,没问题。但是,如果我尝试在终端中运行程序,工作目录总是“用户/用户名”。你知道如何将工作目录更改为程序所在的位置吗?

这里是示例代码:

#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;
}

【问题讨论】:

  • 为什么要程序使用自己的安装目录作为当前目录?它可能无法在那里写入(如果软件安装正确)。它可能能够更方便地读取文件,但这是值得商榷的。 OTOH,如果我从$HOME/src/subdir/myprogram 启动程序,我希望指定相对于我启动它的目录的文件名,而不是相对于/Applications/Doohickey.app/Contents/MacOS$HOME 或类似的东西。当然,这取决于程序的作用……但请谨慎使用chdir()
  • 我只想把所有文件放在一起。我以前经常使用windows。当我在windows下运行命令行程序时,该程序生成的文件应该与程序位于同一位置。我明白你的意思。我会考虑一下。非常感谢。
  • 请记住,Windows 主要不是一个多用户系统,对于每个用户来说,并没有一个类似于 Unix 主目录的目录。这会导致程序将数据分散到各处。在类 Unix 系统上,建议将数据存储在 $HOME 下。例如,配置信息可能在文件(或目录)$HOME/.yourapp 中。查看 Apple 的“OS X 人机界面指南”,了解在 Mac OS X 上的位置。
  • 我在这里遇到了类似的问题,无法根据此解决方案进行修复。我迫切需要一个解决方案,并会以一些声誉来弥补。 stackoverflow.com/questions/40920783/…
  • 还提供赏金给任何可以帮助我修复它的人。

标签: c++ xcode macos


【解决方案1】:

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

【讨论】:

  • 对于 Xcode 5:产品 -> 方案 -> 编辑方案 -> 运行“appname” -> 选项,在那里你会找到“工作目录”选项。跨度>
  • 我在这里遇到了类似的问题,无法根据此解决方案进行修复。我迫切需要一个解决方案,并会以一些声誉来弥补。 stackoverflow.com/questions/40920783/…
  • 我还将提供赏金给任何可以帮助我修复它的人。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这是一篇非常老的帖子 - 更新 Xcode 12(2020 年 9 月)的一些信息

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

    Step 2) RUN(DEBUG),Working Directory(Checkmark) 并输入 $(PROJECT_DIR) 作为起点。

    【讨论】:

    • 我整年都在寻找那个。
    【解决方案4】:

    您可以使用 chdir(),请参见此处:Change the current working directory in C++

    或者,如果您总是可以发出系统调用 (stdlib.h):http://www.cplusplus.com/reference/clibrary/cstdlib/system/。这不是可移植的,但它可能足以满足您的需要。

    【讨论】:

    • 但是你知道如何获取正在运行的应用的路径吗?
    • argv[0] 总是包含路径(当然还有程序名)
    • 依赖 argv[0] 可能不是一个好主意,没有标准说必须始终有完整路径,可能只有启动它的命令的第一部分。解决方案是使用GetModuleFileName(...)readlink( "/proc/self/exe", ...)
    猜你喜欢
    • 2018-02-13
    • 2015-10-23
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多