首页 > 解决方案 > 如何在 C++ 中正确导航目录路径

问题描述

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

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

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.spvgeom.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/将是名称的一部分,但它没有找到文件,我不确定适当的前缀应该是什么......

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

所以我需要回到2个目录然后进入VRX Engine/Shader......

导航回目录的正确字符串值是什么?

由于文件夹名称中有空格,我是否应该filename使用"../../VRX Engine/Shaders/"或是否也进行初始化?在附加之前我需要初始化什么?"././"VRX Enginefilenameshader name

标签: c++stringvisual-studiopathc++17

解决方案


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

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

或者你可以使用哪些额外的库。

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

查看en.cppreference.com了解详细信息。

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

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

如果您的操作系统支持QtPOCO框架并且您被允许使用它们(例如在 C++11 上),您可以使用适当的 API。所以QDir和QtPoco::Path相关的类,和POCO相关的类。

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


推荐阅读