2

在包含我的 exe 的目录中,我有一个名为“saves”的文件夹。我想显示这个目录包含的文件。

我使用了这里找到的代码: Listing directory contents using C and Windows

现在是棘手的部分。如果我.\\saves\\用作我的目录,它会告诉我找不到路径。但是,如果我使用..\\release\\saves\\它可以正常工作。但那很愚蠢。我不想转到父文件夹然后返回。特别是关于我不知道用户给包含 exe 的目录起什么名字(在我的情况下它是“发布”但谁知道用户做了什么:-D)。

我通读了这个: http: //msdn.microsoft.com/en-us/library/aa365247 (v=vs.85).aspx#fully_qualified_vs._relative_paths但它并没有太大帮助。

我也尝试过saves\\.\saves\\但它也不起作用。

我希望有人能告诉我如何解决这个问题。

4

4 回答 4

3

您实际上在代码中没有做错任何事情——您一直在从 Visual Studio 启动项目,它将工作目录设置为 Release/Debug 文件夹的父级。

转到项目->设置(属性)->配置属性->调试->工作目录

您还可以在 VS 之外运行 exe,相对路径的行为将与您预期的一样。

于 2013-06-04T15:06:10.593 回答
2

如果它与可执行文件的路径相关,而不是当前工作目录的路径,则可以使用它GetModuleFileName()来获取可执行文件的完整路径。然后,从路径末尾删除可执行文件的名称并使用它构建路径:

std::string executable_directory_path()
{
    std::vector<char> full_path_exe(MAX_PATH);

    for (;;)
    {
        const DWORD result = GetModuleFileName(NULL,
                                               &full_path_exe[0],
                                               full_path_exe.size());

        if (result == 0)
        {
            // Report failure to caller.
        }
        else if (full_path_exe.size() == result)
        {
            // Buffer too small: increase size.
            full_path_exe.resize(full_path_exe.size() * 2);
        }
        else
        {
            // Success.
            break;
        }
    } 

    // Remove executable name.
    std::string result(full_path_exe.begin(), full_path_exe.end());
    std::string::size_type i = result.find_last_of("\\/");
    if (std::string::npos != i) result.erase(i);

    return result;
}
于 2013-03-05T15:11:46.657 回答
0

我认为您的错误是使用\\saves\\并忘记指定搜索参数/字符串
您应该使用:

saves\\*

这将搜索任何文件或文件夹

于 2013-03-05T15:12:13.690 回答
0

我会使用boost::filesystem http://www.boost.org/doc/libs/1_53_0/libs/filesystem/doc/index.htm

作为奖励,您将获得独立于操作系统的代码。

于 2013-03-05T15:13:32.020 回答