在不知道工作目录的情况下打开项目中特定文件的方法
Methods for opening a specific file inside the project WITHOUT knowing what the working directory will be
我在许多语言中都遇到过这个问题,最近是在 C++ 中。
例证的问题
假设我们正在使用 C++ 并具有以下项目文件结构:
("Project" main folder with three [modules, data, etc] subfolders)
现在说:
- 我们的
maincode.cpp
在项目文件夹中
moduleA.cpp
在 modules 文件夹中
data.txt
在 data 文件夹中
moduleA.cpp
想读data.txt
所以我目前的做法是假设 maincode.cpp
在项目中编译和执行文件夹,因此 硬编码 moduleA.cpp
中的路径 data/data.txt
进行读取(假设我使用 fstream fs("data/data.txt")
进行读取)。
但是,如果代码出于某种原因在 etc
文件夹中执行怎么办?
有解决办法吗?
问题
- 这是一个有效的问题吗?还是我遗漏了 wd(工作目录)概念基础知识?
- 在 C++ 中是否有任何绕过绝对路径的方法来解决这个问题?
- 有没有通用的方法可以用任何语言做同样的事情?
- 如果没有合理的方法,你会怎么处理这个问题?
如果我遗漏了问题插图中的任何重要细节,请发表评论!
在某些时候,程序必须假设文件的位置。通过从用户输入或具有假定文件名的相对路径获取它。正如评论中所说,C++ 最近在 C++17 中添加了 std::filesystem
,这可以帮助您制作 cross-platform 与主机文件系统交互的代码。
话虽这么说,每个程序,无论大小,都必须在某个时候做出某些假设,删除或移动某些文件对任何程序来说都是有问题的,因为程序要求它们位于特定位置下的特定位置姓名。除了向用户显示错误消息等之外,这是无法解决的。
你的程序可以从主调用中的 argv[0]
推断出路径,如果你知道它总是相对于你的可执行文件或者你使用像 "C:\myProgram\data\data.txt 这样的绝对路径”。
第二种方法适用于所有语言。
正如@Hatted Rooster 所说,如果不做一些假设,它通常无法解决某些任意文件,但是有些框架允许您将某些文件“存储”在嵌入可执行文件(或其他方式)的资源中。这些框架通常允许您以不透明的方式处理此类文件,而无需依赖当前的工作目录或相对路径。
例如,参见 the Qt Resource System。
我在许多语言中都遇到过这个问题,最近是在 C++ 中。
例证的问题
假设我们正在使用 C++ 并具有以下项目文件结构:
("Project" main folder with three [modules, data, etc] subfolders)
现在说:
- 我们的
maincode.cpp
在项目文件夹中 moduleA.cpp
在 modules 文件夹中data.txt
在 data 文件夹中moduleA.cpp
想读data.txt
所以我目前的做法是假设 maincode.cpp
在项目中编译和执行文件夹,因此 硬编码 moduleA.cpp
中的路径 data/data.txt
进行读取(假设我使用 fstream fs("data/data.txt")
进行读取)。
但是,如果代码出于某种原因在 etc
文件夹中执行怎么办?
有解决办法吗?
问题
- 这是一个有效的问题吗?还是我遗漏了 wd(工作目录)概念基础知识?
- 在 C++ 中是否有任何绕过绝对路径的方法来解决这个问题?
- 有没有通用的方法可以用任何语言做同样的事情?
- 如果没有合理的方法,你会怎么处理这个问题?
如果我遗漏了问题插图中的任何重要细节,请发表评论!
在某些时候,程序必须假设文件的位置。通过从用户输入或具有假定文件名的相对路径获取它。正如评论中所说,C++ 最近在 C++17 中添加了 std::filesystem
,这可以帮助您制作 cross-platform 与主机文件系统交互的代码。
话虽这么说,每个程序,无论大小,都必须在某个时候做出某些假设,删除或移动某些文件对任何程序来说都是有问题的,因为程序要求它们位于特定位置下的特定位置姓名。除了向用户显示错误消息等之外,这是无法解决的。
你的程序可以从主调用中的 argv[0]
推断出路径,如果你知道它总是相对于你的可执行文件或者你使用像 "C:\myProgram\data\data.txt 这样的绝对路径”。
第二种方法适用于所有语言。
正如@Hatted Rooster 所说,如果不做一些假设,它通常无法解决某些任意文件,但是有些框架允许您将某些文件“存储”在嵌入可执行文件(或其他方式)的资源中。这些框架通常允许您以不透明的方式处理此类文件,而无需依赖当前的工作目录或相对路径。
例如,参见 the Qt Resource System。