如何在C++中正确导航目录路径



我正在Visual Studio中开发一个解决方案。它目前有两个项目。

我将用大写字母表示目录或文件夹,文件名将全部小写。我的解决方案结构如下:

  • 解决方案总监
    • 项目库
      • 源文件
      • 着色器
        • 着色器文件
    • ProjectApp
      • 源文件
    • x64
      • 调试
        • app.exe//调试生成
      • Release
        • 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.spvfrag.spvgeom.spv等。我在这里不包括路径,因为这些路径将用作std::map<string_view, object>的密钥。因此,我将这些名称的向量从::initVulkan函数传递到::createPipeline()

在CCD_ 10内是CCD_。

至于我的问题。。。在::readFile()中,我正在创建一个本地string,并尝试使用适当的路径对其进行初始化。。。然后为着色器的文件名附加CCD_ 15,从这两行可以看出。。。

std::string filename = std::string("Shaders/");
filename.append(shadername);

我正试图找出合适的字符串来初始化filename。。。Shaders/将是名称的一部分,但它找不到文件,我不确定合适的前缀应该是什么…

我在两个项目中的工作目录如下:

  • 项目应用程序->(SolutionDir(x64/Release AND$(SolutionDir(x64/Debug
  • ProjectLib->(SolutionDir(x64/Release AND$(SolutionDir(x64/Debug

所以我需要返回2个目录,然后进入VRX Engine/Shader。。。

用于导航回目录的正确字符串值是多少?

我是用"../../VRX Engine/Shaders/"初始化filename,还是也用"././",因为文件夹名称中有空格,所以我应该在VRX Engine周围加引号吗?在将shader name附加到filename之前,我需要用什么初始化CCD_23?

如何在C++中正确导航目录路径

这取决于您的实现声称符合哪个C++标准

或者您可以使用哪些附加库

C++在没有目录的计算机上很有用(例如中的-一些用C++编码并用GCC编译的操作系统内核,请参阅OSDEV以获取示例(。

有关详细信息,请访问en.cppreference.com

当使用额外的开源库时,许可限制可能很重要。

如果您的实现符合C++17(以"托管"而非"独立"的方式(,请使用标准库的std::filesystem部分。

如果您的操作系统支持Qt或POCO框架,并且允许您使用它们(例如在C++11上(,则可以使用适当的API。因此QDir和具有Qt的相关类、Poco::Path和具有POCO的相关类。

也许您只想为WinAPI编写代码。然后阅读它的文档(我自己从来没有在Windows上编码过,只是在POSIX或Unix上编码,例如Linux和MSDOS…(

我最初是用"../../VRX Engine/Shaders/"正确初始化本地临时string,然后将string_view附加到它以打开文件。这实际上是正确的,但因为它最初不起作用,我认为它是错误的。

返回一个目录的正确字符串值应该是"../",至少在Windows上,我不确定LinuxMacAndroid等…

我的问题根本不在于字符串,它与我的项目中的设置有关。在构建为可执行文件的项目中,我将其工作目录分别设置为$(SolutionDir)x64/Debug$(SolutionDir)x64/Release,这对于我的解决方案结构来说是正确的。

这个问题发生在我的Engine项目中,该项目正在作为静态库构建。在其工作目录的设置中,我忘记修改DebugRelease构建选项。。。这些仍然被设置为Visual Studio的默认值,我认为它是(ProjectDir)。一旦我将它们更改为$(SolutionDir)x64/Debug$(SolutionDir)x64/Release以匹配我的ApplicationProject,我就可以打开并读取文件的内容。

相关内容

  • 没有找到相关文章

最新更新