【问题标题】:Methods for opening a specific file inside the project WITHOUT knowing what the working directory will be在不知道工作目录是什么的情况下打开项目中特定文件的方法
【发布时间】:2020-09-30 12:26:50
【问题描述】:

我在很多语言中都遇到过这个问题,最近是 C++。

问题举例

假设我们正在使用 C++,并且项目的文件结构如下:
("Project" main folder with three [modules, data, etc] subfolders)

现在说:

  1. 我们的maincode.cppProject文件夹中
  2. moduleA.cpp 位于 modules 文件夹中
  3. data.txtdata 文件夹中
  4. moduleA.cpp想看data.txt

所以我目前的做法是 assume maincode.cppProject 文件夹中编译和执行,所以 hardcode em> moduleA.cpp 中的路径 data/data.txt 进行读取(假设我使用了 fstream fs("data/data.txt") 这样做)。
但是,如果出于某种原因,代码在 etc 文件夹中执行,该怎么办?
有没有办法解决这个问题?

问题

  1. 这是一个有效的问题吗?还是我错过了 wd(工作目录)概念基础知识?
  2. 是否有任何方法可以绕过绝对路径以在 C++ 中解决此问题?
  3. 是否有任何通用方法可以用任何语言做同样的事情?
  4. 如果没有合理的方法,您将如何处理这个问题?

如果我错过了问题插图中的任何重要细节,请发表评论!

【问题讨论】:

标签: c++ file-io working-directory file-structure


【解决方案1】:

在某些时候,程序必须假设文件在哪里。通过从用户输入或具有假定文件名的相对路径获取它。正如 cmets 中已经说过的,C++ 最近在 C++17 中添加了std::filesystem,它可以帮助您编写与主机文件系统交互的跨平台代码。

话虽如此,每个程序,无论大小,都必须在某些时候做出某些假设,删除或移动某些文件对于任何程序都是有问题的,以防程序要求它们以某个名称位于某个位置。除了向用户显示错误消息等之外,这是无法解决的。

【讨论】:

    【解决方案2】:

    正如@Hatted Rooster 所说,如果不做一些假设,对于某些任意文件通常无法解决,但是有些框架允许您将某些文件“存储”在嵌入到可执行文件(或其他方式)中的资源中。这些框架通常允许您以不透明的方式处理此类文件,而无需依赖当前的工作目录或相对路径。

    例如,请参阅the Qt Resource System

    【讨论】:

      【解决方案3】:

      如果你知道它总是相对于你的可执行文件,或者你使用像“C:\myProgram\data\data.txt”这样的绝对路径,你的程序可以在主调用中从argv[0] 推断出路径。 第二种方法适用于所有语言。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-27
        相关资源
        最近更新 更多