c++ - 如何在 C++ 中正确导航目录路径
问题描述
我正在开发 Visual Studio 中的解决方案。目前有两个项目。
我将用大写字母表示目录或文件夹,文件名将全部小写。我的解决方案结构如下:
- 解决方案目录
- 项目库
- 源文件
- 着色器
- 着色器文件
- 项目应用程序
- 源文件
- x64
- 调试
- app.exe // 调试构建
- 发布
- app.exe // 发布构建
- 调试
- 项目库
在ProjectLib
我有一个打开和读取我的着色器文件的功能。这是我的函数的样子:
std::vector<char> VRXShader::readFile(std::string_view shadername) {
std::string filename = std::string("Shaders/");
filename.append(shadername);
std::ifstream file(filename.data(), std::ios::ate | std::ios::binary);
if (!file.is_open()) {
throw std::runtime_error("failed to open file!");
}
size_t fileSize = static_cast<size_t>(file.tellg());
std::vector<char> buffer(fileSize);
file.seekg(0);
file.read(buffer.data(), fileSize);
file.close();
return buffer;
}
这个函数在我的函数中被调用VRXDevices::createPipeline
,这里是相关代码:
void VRXDevices::createPipeline(
VkDevice device, VkExtent2D swapChainExtent, VkRenderPass renderPass,
const std::vector<std::string_view>& shaderNames,
VkPipelineLayout& pipelineLayout, VkPipeline& pipeline
) {
std::vector<std::vector<char>> shaderCodes;
shaderCodes.resize(shaderNames.size());
for (auto& name : shaderNames) {
auto shaderCode = VRXShader::readFile(name.data());
}
// .... more code
}
正在创建名称并将其从我的函数传递给此函数VRXEngine::initVulkan
,可以在此处看到:
void VRXEngine::initVulkan(
std::string_view app_name, std::string_view engine_name,
glm::ivec3 app_version, glm::ivec3 engine_version
) {
//... code
std::vector<std::string_view> shaderFilenames{ "vert.spv", "frag.spv" };
VRXDevices::createPipeline(device_, swapChainExtent_, renderPass_, shaderFilenames, pipelineLayout_, graphicsPipeline_);
}
我只使用了着色器文件的名称,例如vert.spv
,frag.spv
等geom.spv
。我不包括这里的路径,因为这些将用作std::map<string_view, object>
. 所以我将这些名称的向量从我的::initVulkan
函数传递到::createPipeline()
.
内部::createPipeline()
是::readFile()
被称为传递的地方string_view
。
现在至于我的问题......::readFile()
我正在创建一个本地string
并尝试用适当的路径初始化它......然后将string_view
着色器的文件名附加到它上面,从这两行可以看出......
std::string filename = std::string("Shaders/");
filename.append(shadername);
我试图找出适当的字符串来初始化filename
......Shaders/
将是名称的一部分,但它没有找到文件,我不确定适当的前缀应该是什么......
我在两个项目中的工作目录如下:
- ProjectApp -> $(SolutionDir)x64/Release 和 $(SolutionDir)x64/Debug
- ProjectLib -> $(SolutionDir)x64/Release 和 $(SolutionDir)x64/Debug
所以我需要回到2个目录然后进入VRX Engine/Shader
......
导航回目录的正确字符串值是什么?
由于文件夹名称中有空格,我是否应该filename
使用"../../VRX Engine/Shaders/"
或是否也进行初始化?在附加之前我需要初始化什么?"././"
VRX Engine
filename
shader name
解决方案
如何在 C++ 中正确导航目录路径
这取决于您的实现声称符合哪个 C++ 标准。
或者你可以使用哪些额外的库。
C++ 在没有目录的计算机上很有用(例如,在一些用 C++ 编码并用GCC编译的操作系统内核中,参见OSDEV示例)。
查看en.cppreference.com了解详细信息。
使用额外的开源库时,许可限制可能很重要。
如果您的实现符合 C++17(以“托管”而非“独立”方式),请使用std::filesystem
标准库的一部分。
如果您的操作系统支持Qt或POCO框架并且您被允许使用它们(例如在 C++11 上),您可以使用适当的 API。所以QDir
和QtPoco::Path
相关的类,和POCO相关的类。
也许您只想为WinAPI编写代码。然后阅读它的文档(我自己从来没有在 Windows 上编写过代码,只是在 POSIX 或 Unix 上——例如 Linux——和 MSDOS ......)。
推荐阅读
- pyspark - Pyspark中两个列表列的差异
- javascript - react-native Picker,其中第二个选择器的项目取决于第一个选择器的 selectedValue
- c - 有没有办法用这样的变量 args 编写 C 预处理器宏?
- c++ - 填充动态数组 C++
- javascript - 谁能解释一下这段代码的计算公式
- java - TCP/IP Socket 连接使用 C# 和 JAVA 发送十六进制数据
- javascript - 警告 sockjs.js:2998 WebSocket 连接失败:WebSocket 在连接建立之前关闭
- swiftui - SwiftUI:在编辑开始时清除 TextField
- javascript - v-on:keyup & v-model 不更新数据
- javascript - 在移动设备上的页面滚动上删除 bootstrap 4 工具提示,并在点击切换图标时重新启用