2

我正在尝试在大代码中打开文件。

有人告诉我,在处理文件时,使用绝对路径而不是相对路径可能是更好的做法。但是,此代码将由不同的人使用,他们可能会将源代码放在不同的位置(例如 /home/username 或 /home/username/desktop/),因此我认为使用相对路径可能会更好访问我的配置文件,因为我知道它与我的 cpp 文件的关系。

以下是与我的问题相关的文件位置的简短总结:

  • 我要阅读的文件是 /home/me/myproject/config/myfile.txt

  • 我从中读取的文件是 /home/me/myproject/src/myfile.cpp

  • 包含'main'的文件也是/home/me/myproject/src/myfile.cpp(这个文件很大)。

我正在从 Eclipse 启动可执行文件。我认为eclipse将工作目录设置为'main'所在的目录(/home/me/myproject/src/)。

当我要调用 file.open() 时,工作目录 (getcwd()) 现在是 /home/me/myproject/,这让我感到困惑。显然,工作目录已被 main() 和我对 file.open() 调用之间的代码修改。

我的问题是:如果可以由程序的另一部分更改,依赖工作目录似乎很容易出错。另一方面,鉴于我不知道其他开发人员通常将他们的资源放在哪里,我应该怎么知道我的配置路径在哪里?

4

2 回答 2

2

我正在从 Eclipse 启动可执行文件。我认为eclipse将工作目录设置为'main'所在的目录(/home/me/myproject/src/)。

你确定吗?在我看来,它是项目文件夹的顶层(即,类似于“/home/eclipse/myproject”,而不是“/home/eclipse/src”。这可以解释原因:

工作目录 (getcwd()) 现在是 /home/me/myproject/。

是不是别的什么?除非您明确地做了一些事情来导致它“被程序的另一部分更改”,否则它不太可能被“更改”。

我不清楚您是否了解source codeexecutable之间的区别。您的源代码文件不是“运行”。它被编译成可执行文件,这就是运行的内容。使用 eclipse,这些默认放入 Release/ 或 Debug/ (看看),而不是 src/ 目录。eclipse 使用顶层目录的(可能的)原因是这些版本之间的一致性,因此您可以,例如,相对于它的输出。

我的问题是:依赖工作目录似乎很容易出错,

无论如何,这绝对是真的。有特定于操作系统的方法来获取用户主目录的路径。您应该得到它,并在文档中指定要保存配置的位置。如果用户不能正确地做到这一点,这不是你的错——但发出一条信息性消息,例如。“找不到配置文件!”。

鉴于我不知道其他开发人员通常将他们的资源放在哪里,我应该怎么知道我的配置路径在哪里?

请注意,“其他开发人员”根本不需要包含源代码,因为它不需要运行可执行文件

于 2012-04-23T13:43:12.637 回答
-1

接受文件位置作为参数总是一个好主意,因此使用您的软件的人可以轻松尝试不同的配置。

您始终可以做的是找出当前正在运行的二进制文件的位置。如果您没有找到直接的方法,请使用getcwd()和的组合argv[0]。如果进程本身不更改工作目录,则运行命令后不会更改工作目录。

然后你可以截取文件名并将配置文件的名称附加到路径中(在base以下示例中存储在字符串中)。这是一些代码,可以确定路径是绝对路径还是相对路径,并相应地附加它。你需要boost_filesystem它是跨平台的:

#ifdef WITH_BOOST_FILESYSTEM
    boost::filesystem::path basepath(base), filepath(filename);
    if (!basepath.is_complete()) {
        basepath = filepath.remove_leaf() /= basepath;
        base = basepath.string();
    }
#elif __unix__
    if (base[0] != '/') {
        char *f = strdup(filename.c_str()), *d = dirname(f);
        base = string(d).append("/").append(base);
        free(f);
    }
#else
    std::cerr << "Warning: only absolute file paths accepted." << std::endl;
#endif
    base.append("/");
于 2012-04-23T13:45:29.600 回答